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

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

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

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

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

クリーンアーキテクチャ

クリーンアーキテクチャは、レイヤードアキテクチャの一種でRobert C. Martin(Uncle Bob)が2012年に提唱したアーキテクチャーです。

Q&A

0回答

92閲覧

refの受け渡し以外でViewModelProviderを呼び出したい【Flutter】

dedede914

総合スコア63

Flutter

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

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

クリーンアーキテクチャ

クリーンアーキテクチャは、レイヤードアキテクチャの一種でRobert C. Martin(Uncle Bob)が2012年に提唱したアーキテクチャーです。

0グッド

0クリップ

投稿2025/01/04 20:12

編集2025/01/05 04:02

実現したいこと:

検索ボックスに文字が入力(変更)されるたびに、検索結果が返される。
この機能をクリーンアーキテクチャに近い形で実装する
flutter / flutter-riverpod / get_it

想定:

  • 検索ボックスの入力値をSearchViewModelのqueryにバインディングする。
  • 変更通知を受け取るたびにExploreControllerを呼び出し、
  • ExploreControllerがSearchUseCaseを呼び出し、
  • SearchUseCase内で検索結果を取得後、SearchUseCaseがSearchPresenterを呼び出し、
  • SearchPresenterがSearchViewModelのsetItemsを呼びだす。

viewmodel内でviewmodelを呼び出すことになっているのが奇妙ですが、
データバインディングを使用して、クリーンアーキテクチャもしようするとこのような流れが吉なのでは思いました。
もし、想定が間違っている場合、良い実現方法がある場合、指摘してください!

サンプルコード

下のような感じで実装を考えています。
実際は、providerを使用しているため、refをcontrollerからpresenterまで受け渡ししてviewmodelを呼び出さないといけないので、 関係ない層がflutter_riverpodに依存してしまうし、無駄なrefの受け渡しが増えてしまうので困っています。

dart

1final searchViewModelProvider = 2 ChangeNotifierProvider((ref) => DI<SearchViewModel>()); 3 4class SearchViewModel extends ChangeNotifier { 5 final ExploreController _exploreController; 6 SearchViewModel(this._exploreController); 7 8 List<MyResult> _filteredItems = []; 9 String _query = ""; 10 11 String get query => _query; 12 set query(String value) { 13 _query = value; 14 _fireController(); 15 notifyListeners(); 16 } 17 18 List<MyResult> get filteredItems => _filteredItems; 19 set filteredItems(List<MyResult> values) { 20 _filteredItems = values; 21 notifyListeners(); 22 } 23 24 Future<void> _fireController() async { 25 if (_query.isNotEmpty) { 26 _exploreController.search(_query); 27 } 28 } 29} 30 31 32//controller 33//flutter/material.dart have searchcontroller class 34class ExploreController { 35 SearchInteractor _searchInteractor; 36 ExploreController(this._searchInteractor); 37 38 void search(String query) { 39 _searchInteractor.execute(query); 40 } 41} 42 43 44 45 46//usecase 47class SearchInteractor { 48 MyRepository _myRepository ; 49 SearchPresenter _presenter; 50 SearchInteractor(this._myRepository,this._presenter); 51 52 void execute(String input) async{ 53 List<MyResult> results=await _myRepository.getMyResults(input); 54 _presenter.execute(results); 55 } 56} 57 58 59//presenter 60class SearchPresenter { 61 SearchViewModel _viewModel ; 62 SearchPresenter(this._viewModel); 63 64 void execute(List<MyResult> input) async{ 65 _viewModel.filteredItems=input; 66 } 67}

dart

1 2final DI = GetIt.instance; 3 4void setupLocator() { 5 6 //repository 7 DI.registerSingleton<MyRepository>(() => MyRepository()); 8 9 //viewmodel 10 DI.registerFactory<SearchViewModel>( 11 () => SearchViewModel(DI<ExploreController>())); 12 13 //controller 14 DI.registerFactory<ExploreController>( 15 () => ExploreController(DI<SearchInteractor>())); 16 17 //usecase 18 DI.registerFactory<SearchInteractor>(() => SearchInteractor( 19 DI<MyRepository>(), DI<SearchPresenter>())); 20 21 //presenter 22 DI.registerFactory<SearchPresenter>(() => SearchPresenter()); 23}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問