Flutterの縁の下の力持ち存在が、InheritedWidget。これは、自身を参照(継承)しているウイジェットであれば、どの階層であろうともInheritWidgetが持っているプロパティや状態(ステート)にアクセスできる仕組みのこと。
https://medium.com/flutter-jp/inherited-widget-37495200d965
monoさんのこの解説記事はネ申ってる。サンプルコードも適切で、とてもわかりやすい。
Flutterは全部がウイジェットになっており、ウイジェットをひたすらネストすることで色んなUIを作ることができる。ウイジェットに表示させるデータは、各ウイジェットが自分で持ってるわけじゃなくて、どっかのデータを参照することが多い(提供される)。それらのデータは、Flutterだとbuildメソッドで渡す必要がある。Flutterの素晴らしい点もあるが、UIの宣言はImmutableになっている。
で、bulid関数でデータを渡す時、それがウイジェットのインスタンスであるともう無理。継承関係を意識しなければならず、扱いづらい。UIがN件のウイジェットで構成されている場合、N件のウイジェットが各々状態を保つ必要はない。原則、stateが1個あれば良い。
ウイジェットツリーの構造を意識することなく、継承先から親のプロパティにアクセスできる術が、InheritWidgetによって提供される。末端のウイジェットは、InheritWidgetがウオッチしている状態にアクセスできれば良い。
この仕組みを使うと、InheritWidgetで渡されたchildがStatelessWidgetだとしても、contextをたどれば更新されたデータにアクセスでき、そのデータを保持してるウイジェットの状態が「dirty」に変わるので、次のフレームでUIが再構築される。
この辺の仕組みを統一的なAPIでカバーしているのが、Providerパッケージ。Flutterではウイジェットをまたいだデータ同期(状態管理)は、このInheritWidgetの仕組みで行っているので、あとはそれをいい感じにテンプレ化できたらよい。
Providerの利用方法は、こちらの公式記事に詳しいので、どうぞ。これ覚えたらだいだいやっていける。
https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple