🦭

Dart3のsealedクラスを使ってみる

2023/10/30に公開

Overview

Dart3のsealedクラスなるものを使ってみた。enumみたいなやつのようだ。。。
Kotlinにもあったりする。
https://dart.dev/language/branches

summary

使い方の例ですが、こんな感じでただWidgetを切り替えるだけな感じ。
switch文を使って表示を切り替える。本当はもっと複雑なものを作りたい🔨

import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'person.g.dart';

// sealed class自体は、インスタンス化はできない。
sealed class Person {
}

// sealed classを継承したclassを定義する。
class Taro implements Person {
  final String name;
  Taro(this.name);
}

class Hanako implements Person {
  final String name;
  Hanako(this.name);
}

class Jiro implements Person {
  final String name;
  Jiro(this.name);
}

// sealed classを使う場合は、switchを使う。
String whoIsPerson(Person person) => switch (person) {
      Taro() => 'Taro',
      Hanako() => 'Hanako',
      Jiro() => 'Jiro',
};


// プロバイダーでsealed classを使う場合

String persons(PersonsRef ref, Person person) {
  return switch (person) {
    Taro() => 'Taro',
    Hanako() => 'Hanako',
    Jiro() => 'Jiro',
  };
}

Widgetで使うときは、こんな感じでやります。

import 'package:dart_three_example/example/switch/person.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

class PersonSealed extends ConsumerWidget {
  const PersonSealed({super.key});

  
  Widget build(BuildContext context, WidgetRef ref) {
    final taro = ref.watch(personsProvider(Taro('Taro')));
    final hanako = ref.watch(personsProvider(Hanako('Hanako')));
    final jiro = ref.watch(personsProvider(Jiro('Jiro')));
    return Scaffold(
      appBar: AppBar(
        title: const Text('Person Sealed'),
      ),
      body: Center(
        child: Column(
          children: [
            Text(taro),
            Text(hanako),
            Text(jiro),
          ],
        ),
      ),
    );
  }
}

main.dartにimportして、ビルドするだけ

import 'package:dart_three_example/example/record/ui/person_sealed.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

void main() {
  runApp(const ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const PersonSealed(),
    );
  }
}

実行結果

thoughts

使ってみた感想。。。
今の所いい感じの使い方を見つけることができない。引数を渡して、画面に表示するボタンを変更する例ぐらいしか今の所ネットで見かけなかった。

Discussion