問題
Flutterで以下のRangeSlidebarをStatelessWidgetコード内で作成しています。
https://api.flutter.dev/flutter/material/RangeSlider-class.html
しかし、ポップアップ状態ではスライドバーが動作しません。
どのようにすれば良いでしょうか?
#補足イメージ
検索フィルタ用のスライドバーをポップアップで実施しています。
以下は一度ポップアップを閉じて、再度開いた状態です。
値の変更は反映されていますが、スライドバーは動かず、一度閉じないといけません。
#コード
以下は表示側のコード
dart
1class MapsHome extends StatelessWidget { 2Widget build(BuildContext context) { 3 return ChangeNotifierProvider( 4 create: (_) => MapHome(this.uid), 5 child: Consumer<MapHome>( 6 builder: (BuildContext context, model, child) => Scaffold( 7 ・ 8 ・ 9 ・ 10IconButton( 11 color: Colors.black54, 12 icon: Icon(Icons.filter_list, 13 onPressed: () async { 14 if (await openSearchSetting(context, model) =="yes") { 15 //検索フィルタ適用後の処理 16 } 17 }, 18), 19 ・ 20 ・ 21 ・ 22 //検索フィルタのポップアップ処理。 23 Future<String> openSearchSetting(BuildContext context, MapHome model) async { 24 String value = await showDialog<String>( 25 context: context, 26 builder: (BuildContext context) => new SimpleDialog( 27 title: new Text("検索フィルタ", style: TextStyle(fontSize: 17)), 28 children: <Widget>[ 29 Padding( 30 padding: EdgeInsets.fromLTRB(0, 0, 0, 5), 31 child: new Divider(), 32 ), 33 Padding( 34 padding: EdgeInsets.fromLTRB(30, 0, 30, 0), 35 child: Row( 36 mainAxisAlignment: MainAxisAlignment.start, 37 children: [ 38 Text( 39 "評価", 40 style: TextStyle(fontSize: 14), 41 ), 42 RangeSlider( 43 values: model.currentRangeValues, 44 min: 0, 45 max: 10, 46 divisions: 10, 47 labels: RangeLabels( 48 model.currentRangeValues.start.round().toString(), 49 model.currentRangeValues.end.round().toString(), 50 ), 51 onChanged: (RangeValues values) { 52 model.ChangeSearchStarRange(values); 53 }, 54 ), 55 ], 56 ), 57 ), 58 Padding( 59 padding: EdgeInsets.fromLTRB(0, 0, 0, 5), 60 child: new Divider(), 61 ), 62 Row( 63 mainAxisAlignment: MainAxisAlignment.end, 64 children: [ 65 createDialogOption(context, "no", "キャンセル"), 66 createDialogOption(context, "yes", "適用"), 67 ], 68 ), 69 ], 70 ), 71 ); 72 73 return value; 74 } 75 76}
以下は処理側のコード
dart
1class MapHome extends ChangeNotifier { 2 RangeValues currentRangeValues = const RangeValues(0, 10); 3 void ChangeSearchStarRange(RangeValues values) { 4 this.currentRangeValues = values; 5 notifyListeners(); 6 } 7} 8
#補足
RangeSlidebarのサンプルではsetState()で値を更新しています。しかし、私はStatelessWidegetで作成しています。statefullwidget変更の修正範囲の関係からできる限りStatelessWidgetのまま実装の方法を探しています。
https://api.flutter.dev/flutter/material/RangeSlider-class.html
#追記
nskhei様の回答を受けて、追加質問です。
showDialogを動作させるにはChangeNotifierProviderを新たに作成する必要がある。
このshowDialogは検索フィルターで、閉じた先にあるChangeNotifierProviderのインスタンスに値を渡したいと考えています。
新たにChangeNotifierProviderを作成すると、別個のインスタンスになり、値を引き継げないと考えているのですが、どのようにすればよろしいでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/26 23:26
2020/09/26 23:30
2020/09/26 23:44