質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.31%
Flutter

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

Q&A

2回答

2812閲覧

FlutterでDIを行うときになぜriverpodが使われるのか

waiwai9090

総合スコア2

Flutter

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

0グッド

0クリップ

投稿2022/07/26 04:52

flutterで各classでの依存物を定義する際、riverpodを使うといいという話をよく目にします。

dart

1final apiClientProvider = Provider.autoDispose( 2 (_) => GithubApiClientImpl(), 3); 4 5final githubRepositoryProvider = Provider.autoDispose( 6 (ref) => GithubRepositoryImpl(ref.read(apiClientProvider)), 7); 8 9final repositoryListViewModelProvider = StateNotifierProvider.autoDispose( 10 (ref) => RepositoryListViewModel(ref.read(githubRepositoryProvider)), 11);

しかし、なぜriverpodを使うといいのかそのメリットがよくわかりません。
下記のように利用時にイニシャライズではいけないのでしょうか?

下記の書き方でもテストファイルでモックをイニシャライズできるなど、テストの面でも十分な気がします。

dart

1 2final githubRepository = GithubRepositoryImpl(GithubApiClientImpl()); 3 4final repositoryListViewModel = RepositoryListViewModel(GithubRepositoryImpl(GithubApiClientImpl()));

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

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

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

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

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

guest

回答2

0

DIのためにRiverpodを選ぶ、というよりは、状態管理に関してメリットの大きいRiverpod、あるいは他の状態管理用パッケージを使う意思決定が為されており、その上で「DI・テストをどうするか」という順序が一般的な気がします。

確かに質問文で示されているようなことはあると思う(間違いではないと思う)のですが、とはいえグローバル変数だと(Flutter/Dartではないですが)下記のページで示されているようなリスクが常につきまとい、規模が大きくなるほど影響も深刻化しやすいので最初から選択肢から除外されているのではないでしょうか。
https://levelup.gitconnected.com/alternatives-to-global-variables-34982becfcc
少なくとも、それらのデメリットをある程度解決する代替案があるのならそちらを選ぶべきだと思います。
そしてRiverpodなどが提供するDIソリューションはそれらのデメリットをある程度解決しています。
(それなりの学習コストはあるわけですけども。)

テストに関しても「Riverpodでなければできない」というようなものでもないですが、もう既に(状態管理で)Riverpodを使うことが決まっているのに、DI・テストはあえて別の方法を選択するほどのメリットも無いと思いますし、自分でやったらやったで何やらかんやら細かいこと、面倒臭いことが出てくるでしょうから、結局全部乗っかるのが良いのではないか、ということになると思います。
(結局それらの細かいこと、面倒臭いことをある程度解決しているのがそれらのパッケージ、ということ。)
それとやはりユーザー数が多ければフィードバックもあるのでそれなりの安全性も見込める、ということも小さくないと思います。

ただ、もちろんアプリの用途や規模によってメリットの大きさも変わってくるので結局はケースバイケースだと思います。

投稿2022/08/06 13:53

moriman

総合スコア615

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

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

0

FlutterでDIを使う場合に最もよく使われている(もしくはもっとも好まれている)パッケージが何かと言われた場合、数値として現れるのは https://pub.dev/ で DI もしくは Dependency Injection で検索して MOST LIKES でソートした結果で出てくるパッケージじゃないでしょうか。

現在そういう意味で好まれているのは GetX のようです。

DIを取り扱うパッケージはいくつも出ていて、自分が合うものを使えばいいんじゃないでしょうか。

後、後半部分のriverpodを使うメリットに関して。
DIを提供するというのはriverpodが保持する機能のうちの一つで、DIだけしか見ないのであれば、わざわざriverpod等のパッケージを使う必要はないかもしれません。

上記のようなパッケージは例えばモデルとビューの分離をしやすくするなど、今どきのアプリケーションを構築する際に便利な機能を包含しているものです。単機能だけ見て論じるものではないと思います。

ちなみに、私も最初に検索に上がったのはriverpodだったのですが、自分の趣向に合わずGetXを使ってます。

投稿2022/07/26 09:53

ta.fu

総合スコア1740

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問