前回言葉足らずだったのでhttps://teratail.com/questions/292820 続きとなります。
widget1の親画面に、widget2のカスタムナビゲーションバー(widgetなのでflutterのbottomBar機能は使えない)を取り付け、タップしたアイコンに応じて別の画面が表示されるようにしたいです。
以下のどちらかが解決策かと思っています。
・state利用してできる方法
・streamBuilderやprovider
こちらは調べてみたものの、今回のように既にstetefullで作っているものからどう移植すべきかわからず、
state利用の方法か、今回のコードに即してproviderを利用する方法/または別の方法がありましたら、ご教示いただきたいです。
widget1(親画面)
Dart
1class Homepage extends StatefulWidget { 2 3 MyAppState createState() => MyAppState(); 4} 5 6class MyAppState extends State<Homepage> { 7 int _index = 0; 8 final List<Widget> _children = [ 9 Page1(), 10 Page2(), 11 Page3(), 12 ]; 13 14 15 Widget build(BuildContext context) { 16 return Scaffold( 17 body: _children[_index], 18 bottomNavigationBar: Nav(), 19 ) 20 } 21}
widget2(ナビゲーションバー)
ここでonTapごとにint posの値が変わるので、これが変わる度に、widget1のint _indexを変更し、それによってwidget1に呼ばれる画面を変えたいです。
Dart
1class Nav extends StatefulWidget { 2 3 NavState createState() => NavState(); 4} 5 6class NavState extends State<Nav> { 7 List<NavItemClass> items = List<NavItemClass>(); 8 int pos = 0; 9 10 11 void initState() { 12 super.initState(); 13 14 items.add(NavItemClass( 15 true, 16 'assets/svg/home.svg', 17 'Home', 18 0, 19 )); 20 items.add(NavItemClass( 21 false, 22 'assets/svg/food.svg', 23 'Food', 24 1, 25 )); 26 items.add(NavItemClass( 27 false, 28 'assets/svg/weight.svg', 29 'Weight', 30 2, 31 )); 32 } 33 34 35 Widget build(BuildContext context) { 36 return Row( 37 mainAxisAlignment: MainAxisAlignment.center, 38 children: [ 39 Row( 40 children: items.map((i) { 41 return GestureDetector( 42 onTap: () { 43 setState( 44 () { 45 items.forEach((item) => item.isOpen = false); 46 i.isOpen = !i.isOpen; 47 pos = i.pos; 48 }, 49 ); 50 }, 51 child: NavItem( 52 item: i, 53 ), 54 ); 55 }).toList(), 56 ), 57 ], 58 ), 59 ), 60 ], 61 ); 62 } 63}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/20 03:12