前提
初めまして。よろしくお願いいたします。
(モダンな言語であれば)言語に依らない内容だとは思うのですが、
Flutter(Dart)でRiverpodを使い、状態管理を行うという場面を想定しています。
RiverpodはFlutterで状態管理、通知、UI更新を行ってくれるパッケージです。
実現したいこと
関東、関西などの9つのエリアにそれぞれ都道府県があり、
さらにその都道府県の下に市区町村、市が政令指定都市であれば行政区、
といったコレクションを作成し、状態管理を行いたいです。
リストとして表示を行い、各項目を選択することが出来ます。
子を持つ要素に関してはアコーディオンで表示・非表示を切り替える機能を持ちます。
また、子が全て選択された場合は子の選択を全て外して親を選択する、
親を選択した場合は子の選択をすべて外す、などの処理を入れます。
それぞれが選択されているか、アコーディオンが開いているか、などの情報を持たせて、
それをもとに表示を構築します。
発生している問題・エラーメッセージ
上記のようなコレクションを構築する場合、自分が考えた方法ですと、
エリア、都道府県、市区町村、行政区のクラスを作成する、(AreaState、PrefStateのようなイメージ)
エリアのリストを作成する、(List<AreaState> areaStatesのようなイメージ)
そのエリアに入る都道府県リストを作成しエリアと紐づける、(AreaState.prefStatesのようなイメージ)
その都道府県に・・・以下続きます。
dart
1class AreaState { 2 const AreaState({ 3 required this.id, 4 required this.name, 5 required this.prefStates, 6 this.isSelected = false, 7 this.isOpened = false, 8 }); 9 10 final int id; 11 final String name; 12 final List<PrefState> prefStates; 13 final bool isSelected; 14 final bool isOpened; 15}
といった具合に、どんどん入れ子にしていくのが(親からたどりやすいので)管理が簡単かなと思いました。
しかし、考えていくうちにこれでは無理では、と思い始めました。
Riverpodでステート管理を行う場合、ステートはイミュータブルである必要があります。
ステート更新には毎回インスタンスを再生成する必要がある
(state[0].isSelected = true みたいなことは出来ない)のですが、
そうなると入れ子構造では、最下層の更新ですらステートを再構築しなければいけませんでした。
試しにコードも書いてみましたが、子から親を参照し、値を変えられないので
毎回トップのエリアからforを回してifで判定せざるを得ないような感じです。
このような状態管理、機能を実装したい場合、どのような設計にするのがスマートでしょうか?
ご回答、またおかしな部分があればご指摘お願いいたします。
プログラミングというより、アルゴリズムの質問となります。
まともにコードを掲載できなくて申し訳ございません。
回答2件
あなたの回答
tips
プレビュー