Chapter 34無料公開

Riverpod v2.0.0 の変更点(v1.x.xとの比較)

村松龍之介
村松龍之介
2022.05.31に更新

2022年6月1日、最終確認
https://pub.dev/packages/flutter_riverpod/versions/2.0.0-dev.9/changelog

2.0.0-dev.9

  • cacheTime / disposeDelay を使用して ProviderContainer を破棄する際のタイマーリークが修正されました。

2.0.0-dev.8

  • ネストした ProviderScope をアンマウントすると例外が発生するバグが修正されました。

2.0.0-dev.7

  • 最小要求Dartバージョンが 2.17.0 になりました。
  • 最小要求Flutterバージョンが 3.0.0 になりました。

2.0.0-dev.6

  • ConsumerStatefulWidget/ConsumerStateinitState 等の使用を想定する WidgetRef.listenOnce が追加されました。
  • エラーを無視して値を取得するために AsyncValue.valueOrNull を追加されました。
  • AsyncValue.value がエラーがあるにも関わらすThrowしない問題が修正しました。
  • FamilyProvidercacheTime/disposeDelay が適用されない問題が修正されました。
  • KeepAliveLink がキャンセルされた後、非同期で例外がThrowされる場合がある不具合が修正されました。

2.0.0-dev.5

  • AsyncError の後に AsyncData が発行されても AsyncValue.hasErrortrue になってしまう不具合が修正されました。

2.0.0-dev.4

  • Scopeの親を手動でオーバーライドできる ProviderScope.parent が追加されました。
    モーダルやダイアログがScopedなプロバイダにアクセスできるようにするために使用できます。
  • プロバイダの変更をそのプロバイダ内で購読するための ref.listenSelf が追加されました。
    「ログ出力」や「データベースにプロバイダの状態を保存する」といったユースケースに使用できます。
  • すべての autoDispose プロバイダと ProviderScope/ProviderContainerdisposeDelay が追加されました。
    プロバイダへの監視(購読)が無くなってからプロバイダが破棄されるまでの遅延時間を設定できます。
  • providerContainer.invalidate(provider) , ref.invalidate(provider) , ref.invalidateSelf() が追加されました。
    ref.refresh より安全で、プロバイダをすぐに再構築しないのでプロバイダが2回連続で再構築されるのを避けることができます。
  • cacheTime に渡されたDurationの挙動が以下のように変更になりました。
    変更前:プロバイダが最初に構築されたときの最小時間 変更後:プロバイダの最新の変更後の最小時間
  • プロバイダが誤って自分自身に依存し、 autoDispose が壊れる問題が修正されました。
  • StateNotifier.autoDisposestate を使用した際のメモリリークが修正されました。
  • ProviderObserver.didDisposeProvider がプロバイダのリフレッシュ時に実行されない問題が修正されました。

2.0.0-dev.3

  • プロバイダ内で ref.listen を実行しており、依存関係の1つが変更された場合に、そのプロバイダが適切に再構築されるようになりました。

2.0.0-dev.2

  • ref.maintainState = true/false が非推奨となり、新たに ref.keepAlive() が追加されました。
    ref.keepAlive() 関数は、各Providerの状態を一定期間維持したい複数のロジックがある場合にうまく処理されます。
  • 非推奨の ProviderReference が削除されました。
  • ProviderContainer.cacheTimeMyProvider.autoDispose(_, cacheTime: duration) が追加されました。
    参照されなくなった autoDispose Providerを指定した時間生存させられます。(デフォルト値: Duration.zero
  • ref.onAddListener が追加されました。
    新しいリスナーがプロバイダに追加されるたびに実行するコールバックを追加できます。
  • ref.onRemoveListener が追加されました。
    リスナーがプロバイダから削除されたときに実行するコールバックを追加できます。
  • ref.onCancel が追加されました。
    プロバイダの最後のリスナーが削除されたときに実行するコールバックを追加できます。
  • ref.onResume が追加されました。
    プロバイダの最後のリスナーが削除された( ref.onCancel の実行)後、再びリスニングされるときに実行するコールバックを追加できます。

2.0.0-dev.1

  • Dart 2.16 が必須になりました。
  • プロバイダの値構築中に例外が発生しても ProviderException がスローされないようになり、代わりに発生した例外とスタックトレースを再スローするようになりました。
  • AsyncValueisError , isData が削除されました。
  • AsyncValuehasError , hasData が追加されました。
  • AsyncValue に、 AsyncValue を複製して1つ前の値とマージする copyWithPrevious が追加されました。
    これにより、 AsyncData がエラーを含んだり、 AsyncError が値を含むことができるようになります。AsyncLoading の前が AsyncData, AsyncError だった場合は、 isLoadingtrueAsyncData/AsyncError になります。
  • 非同期の値を待ちながら、再構築のフィルタリングもできる provider.selectAsync が追加されました。
  • プロバイダが AsyncError に続いて AsyncData を発行するとき、その AsyncData に最新の error/stackTrace が含まれるようになりました。
  • より具体的なプロバイダタイプでプロバイダをオーバーライドする際のキャストエラーが修正されました。
  • autoDispose 使用時、特定の条件下で onDipose が2回実行されることがある不具合が修正されました。

2.0.0-dev.0

  • プロバイダが AsyncData または AsyncError を発行した後、そのプロバイダはもう AsyncLoading を発行しないようになりました。
    その代わりに最新の値を再発行しますが、 AsyncValue.isRefreshingtrue に設定されます。
    この変更により、プロバイダがリフレッシュされても、UIは以前のデータやエラーを表示し続けることができます。
  • AsyncValueisLoading , isError , isData , asError が追加されました。
    これらを使えうとパターンマッチングすることなく AsyncValue の状態を確認できます。
  • provider.future , provider.stream のリフレッシュが正しく動作していなかった問題が修正されました。
  • ref.watch で発生する可能性のあった assert の誤検出が修正されました。

https://pub.dev/documentation/riverpod/2.0.0-dev.9/riverpod/ProviderContainer/cacheTime.html
https://pub.dev/documentation/riverpod/2.0.0-dev.9/riverpod/AsyncValue/copyWithPrevious.html
https://pub.dev/documentation/riverpod/2.0.0-dev.9/riverpod/Ref/onAddListener.html
https://pub.dev/documentation/riverpod/2.0.0-dev.9/riverpod/Ref/onCancel.html
https://pub.dev/documentation/riverpod/2.0.0-dev.9/riverpod/Ref/onRemoveListener.html
https://pub.dev/documentation/riverpod/2.0.0-dev.9/riverpod/Ref/onResume.html