前提・実現したいこと
Flutterの下タブメニューを押して、画面遷移する際にNavigationBarが消えてしまわないようキープする挙動を実現したいです。
下記の記事を参考にしながら、実装しようとするもうまくいきません。
https://qiita.com/canisterism/items/d648da85c300a3751db0
開発条件としてProviderを使用することです。
ChangeNotifierからtabBuilderに対応する値をセットしてあげたいのですが、どう設定していいかがわからずtabBuilderの部分で
The argument type 'Consumer<MyPageChangeNotifier>' can't be assigned to the parameter type 'Widget Function(BuildContext, int)'.
とエラーがでてしまいます。
flutter
1import 'package:flutter/material.dart'; 2import 'package:flutter/cupertino.dart'; 3import 'package:flutter/widgets.dart'; 4import 'package:provider/provider.dart'; 5 6import 'MyPageChangeNotifier.dart'; 7import 'package:talent/view/screen/myPage/component/Profile.dart'; 8import 'package:talent/view/screen/myPage/component/RequestStatus.dart'; 9import 'package:talent/view/component/Header.dart'; 10import 'package:talent/PresentIcon.dart'; 11import 'package:talent/SettingIcon.dart'; 12import 'package:talent/view/screen/myPage/component/NoticeItem.dart'; 13// import 'package:talent/view/component/BorderedText.dart'; 14 15class MyPageScreen extends StatelessWidget { 16 @override 17 Widget build(BuildContext context) { 18 return ChangeNotifierProvider<MyPageChangeNotifier>( 19 create: (context) => MyPageChangeNotifier(), 20 child: CupertinoTabScaffold( 21 tabBar: CupertinoTabBar( 22 items: <BottomNavigationBarItem>[ 23 BottomNavigationBarItem(icon: Icon(Icons.face), title: Text('タレント')), 24 BottomNavigationBarItem(icon: Icon(PresentIcon.present_icon), title: Text('リクエスト')), 25 BottomNavigationBarItem(icon: Icon(SettingIcon.setting_icon), title: Text('設定')), 26 ], 27 currentIndex: currentIndex, 28 onTap: (n) { 29 switch (n) { 30 case 0: 31 onTapItem(TabItem.Talent); 32 currentIndex = TabItem.Talent.index; 33 break; 34 case 1: 35 onTapItem(TabItem.Message); 36 currentIndex = TabItem.Message.index; 37 break; 38 case 2: 39 onTapItem(TabItem.Setting); 40 currentIndex = TabItem.Setting.index; 41 break; 42 } 43 } 44 ), 45 tabBuilder: Consumer<MyPageChangeNotifier>(builder: (context, value, child) { 46 value.navigation(context, tabItem) 47 }); //エラー箇所 48 body: Consumer<MyPageChangeNotifier>( 49 builder: (context, value, child) { 50 return SingleChildScrollView( 51 child: Column( 52 children: <Widget>[ 53 Container( 54 color: Color(0xffF5F6F9), 55 child: Padding( 56 padding: EdgeInsets.only(top: 40.0, bottom: 60.0, right: 40.0, left: 40.0), 57 child: Column( 58 children: <Widget>[ 59 Profile(), 60 SizedBox(height: 20.0), 61 RequestStatus(), 62 ], 63 ), 64 ), 65 ), 66 Padding( 67 padding: EdgeInsets.only(top: 40.0, right: 24.0, left: 24.0, bottom: 63.0), 68 child: Column(children: <Widget>[ 69 // BorderedText(text: "お知らせ"), 70 SizedBox(height: 24.0), 71 NoticeItem(text: value.text, date: value.date), 72 SizedBox(height: 20.0), 73 NoticeItem(text: value.text, date: value.date), 74 ]), 75 ), 76 ], 77 ), 78 ); 79 }, 80 ), 81 ) 82 ); 83 } 84}
Provider
flutter
1import 'package:flutter/cupertino.dart'; 2import 'package:talent/view/screen/myPage/MyPageScreen.dart'; 3 4enum TabItem { 5 Talent, 6 Message, 7 Setting, 8} 9 10class MyPageChangeNotifier with ChangeNotifier { 11 String _date = "2020.XX.XX"; 12 String _text = "お知らせお知らせお知らせお知らせお知らせお知らせお知らせお知らせお知らせお知らせお知らせお知らせ。"; 13 14 get date => _date; 15 get text => _text; 16 17 Widget (TabItem tabItem) { 18 switch (tabItem) { 19 case TabItem.Talent: // 1番左のタブが選ばれた時の画面 20 return CupertinoTabView(builder: (context) { 21 return CupertinoPageScaffold( 22 child: MyPageScreen(), // 表示したい画面のWidget 23 ); 24 }); 25 break; 26 case TabItem.Message: // 1番左のタブが選ばれた時の画面 27 CupertinoTabView(builder: (context) { 28 return CupertinoPageScaffold( 29 child: MyPageScreen(), // 表示したい画面のWidget 30 ); 31 }); 32 break; 33 case TabItem.Setting: // 1番左のタブが選ばれた時の画面 34 CupertinoTabView(builder: (context) { 35 return CupertinoPageScaffold( 36 child: MyPageScreen(), // 表示したい画面のWidget 37 ); 38 }); 39 break; 40 } 41 return null; 42 } 43} 44
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。