やりたいこととできないこと
現在、tabを移動してもCupertinoSegmentedのタップした選択肢をそのままにする機能を作ろうとしています。
値の保存はでき、tabを移動しても選択したままにはできましたが、今回CupertinoSegmentedは共通化しており、ひとつ選択するともう一つのCupertinoSegmentedも選択されてしまいます。
今回はこれを無くしたいです。
コード
dart
1 2// @dart=2.9 3import 'package:flutter/material.dart'; 4import 'package:flutter/cupertino.dart'; 5import 'package:provider/provider.dart'; 6 7void main() => runApp(TabbedAppBarSample()); 8 9class TabbedAppBarSample extends StatelessWidget { 10 11 Widget build(BuildContext context) { 12 return MultiProvider( 13 providers: [ 14 ChangeNotifierProvider<SameCupertinoSegmentedControlModel>( 15 create: (context) => SameCupertinoSegmentedControlModel(), 16 ), 17 ], 18 child:MaterialApp( 19 home: DefaultTabController( 20 length: 2, 21 child: Scaffold( 22 appBar: AppBar( 23 leading: TextButton( 24 onPressed: () { 25 Navigator.of(context).pop(); 26 }, 27 child: const Text( 28 '戻る', 29 style: TextStyle( 30 color: Colors.white, //文字の色を白にする 31 fontSize: 12, //文字のサイズを調整する 32 ), 33 ), 34 ), 35 title: const Text('テスト'), 36 bottom: const TabBar( 37 labelPadding: EdgeInsets.zero, 38 tabs: [ 39 Tab(text: 'SameCupertinoSegmentedページ'), 40 Tab(text: 'テストページ'), 41 ], 42 ), 43 ), 44 body: TabBarView( 45 physics: const NeverScrollableScrollPhysics(), 46 children: [ 47 CarPage(), 48 const Icon(Icons.document_scanner), 49 ], 50 ), 51 ) 52 ) 53 ) 54 ); 55 } 56} 57 58class CarPage extends StatelessWidget { 59 60 61 Widget build(BuildContext context) { 62 return Scaffold( 63 body: Column( 64 children: [ 65 SameCupertinoSegmentedControl( 66 title: 'タイトル1', 67 value: {0: Text('value1'), 1: Text('value2')} 68 ), 69 SameCupertinoSegmentedControl( 70 title: 'タイトル2', 71 value: {0: Text('value3'), 1: Text('value4')} 72 ), 73 ], 74 ), 75 ); 76 } 77} 78 79class SameCupertinoSegmentedControl extends StatelessWidget { 80 const SameCupertinoSegmentedControl({this.title, this.value}); 81 82 final String title; 83 final Map<int, Widget> value; 84 85 86 87 Widget build(BuildContext context) { 88 final selectedValue = context.select( 89 (SameCupertinoSegmentedControlModel store) => store.selectedValue); 90 91 return Row( 92 children: [ 93 const Padding(padding: EdgeInsets.only(top: 30, bottom: 40)), 94 Container( 95 margin: const EdgeInsets.only(left: 10), 96 child: Text(title)), 97 Expanded( 98 child: CupertinoSegmentedControl( 99 children: value, 100 onValueChanged: (index) { 101 print(index); 102 context 103 .read<SameCupertinoSegmentedControlModel>() 104 .changeSelectedValue(int.parse(index.toString())); 105 }, 106 // これをひとつずつ選択できるようすれば直るはず。 107 groupValue: selectedValue 108 ) 109 ), 110 ], 111 ); 112 } 113} 114 115class SameCupertinoSegmentedControlModel with ChangeNotifier { 116 int selectedValue; 117 118 void changeSelectedValue(int index) { 119 selectedValue = index; 120 notifyListeners(); 121 } 122} 123 124
実施した手順とその結果
MultiProviderはtab間で状態を保持しておきたいため、SameCupertinoSegmentedControlではなくTabbedAppBarSampleの方に記載しています。もしSameCupertinoSegmentedControlの方にMultiProviderを定義するとやはりtab間での値の保持ができなくなってしまいます。
何が原因だと思うか
CupertinoSegmentedControl内のgroupValueを個別に設定することができれば全てに反映されないのではないかと考えましたが、そのやり方がわかりませんでした。
「CupertinoSegmentedControl groupValue 個別 」 や 「CupertinoSegmentedControl groupValue」のキーワードで検索してみたものの答えとなるような記事には辿り着けませんでした。
何かアドバイスがあればお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。