これは何?
Flutterの sound null safety で対応した時にやったことをまとめたもの
アプリの構成
- 状態管理
- Riverpod
- StateNotifier
- freezed
対応の流れ
公式がまとめてくれているのでまずはこちらを読むのが良い
1. 使っているライブラリが対応しているかの確認
趣味プロダクトでどう対応するか調査している面もあったので、定期的に使っているライブラリが対応しているかの確認した
dart pub outdated --mode=null-safety
2. 自動マイグレーションを実行する
dart migrate
※ 今回の構成だとこのコマンドで単純にマイグレーションできなかったので 3. の手動対応で行った
3. マイグレーションできなかった箇所を手動対応する
Riverbed
StateNotifierProviderの書き方が変わったので対応
状態もジェネリクスで追加で指定する必要がある
Before:
final provider = StateNotifierProvider<MyStateNotifier>((ref) {
return MyStateNotifier();
});
After:
final provider = StateNotifierProvider<MyStateNotifier, MyModel>((ref) {
return MyStateNotifier();
});
StateNotifierの取得方法、StateNotiferの状態を取得する方法が変更された
// 今まで
Widget build(BuildContext context, ScopedReader watch) {
StateNotifier notifier = watch(provider);
}
Widget build(BuildContext context, ScopedReader watch) {
State state = watch(provider.state);
}
// 今後
Widget build(BuildContext context, ScopedReader watch) {
StateNotifier notifier = watch(provider.notifier);
}
Widget build(BuildContext context, ScopedReader watch) {
State state = watch(provider.state);
}
Riverpodはマイグレーションツールが提供されている
freezed
- 初期値がないフィールドは nullableにする
- 必須のフィールドは
@require
からrequired
に書き換える -
@late
をlate
に書き換える
@freezed
abstract class Sample with _$Sample {
factory Sample({
@required String value1,
String value2,
}) = _Sample;
Sample._();
@late
String get value3 => value1 + (value2 ?? '');
}
@freezed
abstract class Sample with _$Sample {
factory Sample({
required String value1,
String? value2,
}) = _Sample;
Sample._();
late final String value3 = value1 + (value2 ?? '');
}
まとめ
- Null Safety 対応のライブラリも増えてきておりそろそろ対応できるようになってきた
- マイグレーションコマンドは用意されているが使っているライブラリによっては利用できなくなる
- 各ライブラリごとに対応方法のドキュメントは書かれているので参考にすると良い