Providerの使い方を理解する。2022-04-21Providerの使い方を理解する。ProviderがピンとこないProvider、状態管理という概念的にはなんとなくわかっても、巷に溢れているチュートリアルや解説を読んでも実装がいまいちがピンとこなかったので可能な限りシンプルに理解を試みてみました。InheritedWidgetは使ったことがありません。ScopedModelも知りません。BLoCという単語もさっぱり。(たぶんこのせいで理解が及んでいない)環境は以下の通りです。^4.3.2+3となります。素のプロジェクトをつくるまず、プロジェクトを生成します。runお馴染みの画面です。これからコードを弄りますが、画面は一切変わらないのでスクリーンショットはこれだけになります。Providerを導入pubspec.yamlにパッケージを追加します。getが走ってくれます。パッケージをインポート。'package:provider/provider.dart';ChangeNotifierを継承してオブジェクトクラスを定義。}}ここで元々、_MyHomePageStateクラスにあった_counterの状態管理をします。値を更新した時は、notifyListeners()を呼ぶようです。main()のrunAppにて、最上位のWidget(ここではMyApp)を包む形でChangeNotifierProviderを追加。}_MyHomePageStateで管理していた_counterをコメントアウトし、カウンターの加算も書き換え。}context.read<MyModel>()で該当するクラスのインスタンスを取得できるようです。更新に応じて表示される_counterも書き換えます。),更新を監視する時はcontext.watch<MyModel>()となるようです。context.select<MyModel>()というのもあって、同じ監視でもMyModelの中味の一部のみを監視できるのだとか。今回は、_counterしかないんですけど。全体の変更はこちら(GitHub)。Widgetに手を入れるもう少しパターンを試してみます。counterの表示部分をWidgetに分離してみます。}}MyAppの下位にあたるWidghtになるので(?)、contextからMyModelを参照できます。MyHomePage::buildの表示部分もCounterに置き換えました。Counter(),ここで気がついたのは、StatefulWidgetではなくStatelessWidgetでよいということ。MyHomePageもStatelessWidgetに変更。{そうすると、State管理する以下の行も全部不要になってしまいます。0;問題なく動作しました。コメントアウトを整理した最終的なコード(GitHub)です。まとまっていないまとめいちおう書いた範囲での使い方は理解したつもりになれました。ChangeNotifierProviderを利用する手法はどうもscoped_model(同名のパッケージのことか手法自体の呼称かは不明)の代わりに使う書き方のようでProviderの本懐ではないようです。現時点で、ChangeNotifierProvider以外にもあるなんたらProviderがまるで理解の範囲外で、つまりProviderの使い方を理解したとは到底言えそうもありません。書いて動かしてやっとわかったこともあって、ChangeNotifierはProviderではなく、そもそもFlutterのクラス。ChangeNorifier)でもよい。データ(オブジェクト)を分離することができれば、これだけでもよりシンプルに書けるということはわかりました。自分理解用の記事になってしまいましたが、どこかの誰かのお役に立てれば幸いです。長年放置している新刊.netアプリをつくらないと。