質問するログイン新規登録

Q&A

解決済

2回答

2662閲覧

riverpodでProviderをグローバル変数で定義するデメリット

waiwai9090

総合スコア2

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2022/07/25 03:01

0

0

riverpodでProviderをグローバルに定義する部分があると思いますが、公式ドキュメントにある説明がちょっと腑に落ちません。

Do not be frightened by the global aspect of providers. Providers are fully immutable. Declaring a provider is no different from declaring a function, and providers are testable and maintainable.

providerは完全に不変であると言っているのですが、stateの更新など、変更の可能性は多くありそうに思えます。
更新時に変更されるとグローバル変数においている分どこから更新されるかわからずに、逆に扱いづらい気もするのですが、これはデメリットにはならないのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Riverpodの目的の一つに「アプリの様々な場所からステートにアクセスできるようになります。」が入っているので、どこからでもアクセス可能ということにデメリットを感じているのであれば使わない方がいいのではないでしょうか。
パッケージ設計者はその点をメリットの一つとして考えているのだと思うので。

もしアクセス制限をするのであれば、実装ルールを設けたり、ProviderObserver派生を作って監視するとかしかないのかも。

投稿2022/07/25 09:57

ta.fu

総合スコア1749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

今更ですがたまたま見かけたので3つに分けて回答させていただきます。
残念ながらベストアンサーの方が間違っているので惑わされないように...

1

まず1番重要なポイントとして、providerがstateを直接持っているわけではありません。
ですので「stateは変化するがproviderは不変である」という説明にも矛盾はありません。
実際にソースコード内でも final provider ... のように final修飾子を付けて不変に定義します。

2

またproviderはグローバルなのでどこからでもアクセスできますが、
stateへのアクセスには必ず「Ref」というものが必要になります。
ですので、どこからでも更新されるという解釈も間違いです。

3

最後に「誰がどこから変更したか」を気にしなくても、
データ不整合が起こらないように安全に管理してくれる仕組みになっているので、
質問者様がデメリットとおっしゃっていることは、むしろメリットになります。
質問者様の心配している方向性は正しいですし、
それを「俺に管理を任せろ!」といっているのがまさにriverpodです。
いらなくなったstateが自動的に消える仕組み等も用意されています。

以上回答になります。長文失礼しました。

投稿2023/03/12 17:47

編集2023/03/12 17:50
rbdog

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問