【Flutter】enhanced-enumsを使う

Dart2.17.0がリリースされました。私は以下のような記事を作成して、Javaっぽいenumができることを期待してました。

Dart で JavaのEnumっぽいことをする

enhanced-enumsで実現できるかな、と期待しましたが、半分しかできませんでした。が、通常の使い方では非常に便利になります。

実装例

まず、enhanced-enumsの実装とテストの例は、以下の通りです。注意点は

  • コンストラクタをconstにする
  • メンバー変数はfinalにして、コンストラクタの引数に全て入れる
enum JobType {
  proper('正社員'),
  partTime('パート');
  
  const JobType(this.name);
  final String name;
}

main() {
  test('enhanced enum', () async {
    expect(JobType.proper == JobType.proper, isTrue);
    expect(JobType.proper.name, '正社員');
  });
}

使用例

色々使い道がありますが、現在enumを選択するDropdownListの表示項目が、enumの変数名そのまんまです。enhanced-enumsにして、表示を日本語で行い、選択した値はenumで取得できるようにしたいと思います。

発生したエラー

以下のエラーが発生しました。そのため、pubspec.yamlを更新して、Dartのバージョンを上げました。

enum_test.dart:10:3: Error: The 'enhanced-enums' language feature is disabled for this library.
Try removing the package language version or setting the language version to 2.17 or higher.
environment:
  sdk: ">=2.17.0 <3.0.0"

上記のように更新して、flutter pub getを実行。そのまえに、flutter pub upgradeも実施したけど、意味があったかは分からない。

残念だった点

本当は以下のように、enumの値によって使用するメソッドを変更できるようにしたかったです。しかし、コンストラクタがconstのため、メソッドを引数にとれませんでした。
「error: A value of type 'Null' can't be assigned to a parameter of type 'int Function(int, int, int)' in a const constructor. (const_constructor_param_type_mismatch ...)」

typedef GetSalary = int Function(int rage, int totalTime, int workTime);
enum JobType {

  proper('正社員',  (salary, total, workTime) => salary * workTime ~/ total),
  partTime('パート', (rage, total, workTime) => workTime * rage);

  const JobType(this.name,this.getSalary);
  final String name;
  final GetSalary getSalary;
}

まとめ

祝Flutter3.0!ということで書きました。他にも色々な機能が出てますので、試していきたいと思います。

参考

What's new in Flutterの17:55あたり