Flutter Riverpodをv1→v2 にした
Riverpodを2系にしたことで発生した、変更点をまとめる。
1. overrideWithProviderが非推奨に
今後削除されると対応が大変なので、今のうちに対応しておく。
今後はoverrideWith
を使う。
Provider側の実装
特に変更なし。ChangeNotifierProviderの例を挙げる。
final hogeProvider = ChangeNotifierProvider.autoDispose<_HogeProvider>(
(ref) => throw UnimplementedError(),
);
final hogeProviderFamiry =
ChangeNotifierProvider.family.autoDispose<_HogeProvider, int>(
(ref, value) => _HogeProvider(ref, value: value),
);
1系の実装
ProvierScope部分のみ抜粋。
return ProviderScope(
overrides: [
hogeProvider.overrideWithProvider(
hogeProviderFamiry(1),
),
],
child: FugaPage(
key: key,
),
);
2系の実装
1系のoverrideWithProvider
ではProviderをoverrideする前提の関数だったのでそのままProviderを渡せばよかったが、overriverWith
は普通に変数とかも渡せるので、やり方を変える必要がある。
具体的には、以下の様にProvider.familyをwatchしたものを渡せばよかった。
return ProviderScope(
overrides: [
hogeProvider.overrideWith(
(ref) => ref.watch(hogeProviderFamiry(1)),
),
],
child: FugaPage(
key: key,
),
);
StateNotifierProviderの場合
ref.watchはProviderListenableを引数に取るが、StateNotifierProviderFamilyはこれを継承していないらしく、エラーになる。(ChangeNotifierProviderFamilyはいけるのになぜ・・・)
色々試した所、notifierはProviderListenableで、これを渡してあげたらいけた。
この辺の仕組みはよく分かってない🥹
return ProviderScope(
overrides: [
fugaProvider.overrideWith(
(ref) => ref.watch(fugaProviderFamiry(1).notifier),
),
],
child: FugaPage(
key: key,
),
);