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,
      ),
    );