こんにちは。
appBar:
body:
bottomNavigationBar:
の3つのウィジェット構成で、appBarとbodyだけ、bottomNavigationBarのタブで切り替える仕様です。
「呼ぶ」と「探す」の2つのタブがあり、それぞれappBarとbodyの内容が違うので、別個に切り替えるイメージです。
それは実装できたのですが、
その上で、「探す」の画面だけさらに「TabBar」があり、そのタブでコンテンツを切り替えたいのです、しかしやり方がわからず困っています。
コードを見ていただくとおり、今回appBarとbodyをそれぞれクラスを別個に分けているためか、appBarにTabBarを追加すると「Undefined name」エラーを吐いてしまいます。
以下コードです。
▼ホーム画面(ここで内容を切り替える、デフォは「呼ぶ」画面)
//ホーム画面 class SignedInTop extends StatefulWidget { @override _SignedInTopState createState() => _SignedInTopState(); } class _SignedInTopState extends State<SignedInTop> { bool _alreadyDisposed = false; int _selectedIndex = 0; //下ナビでアプリバーの切り替え static List<dynamic> _userHomeAppBar = <dynamic>[ GuestCallAppBar(), GuestSearchAppBar(), ]; //下ナビでボディの切り替え static List<Widget> _userHomeBody = <Widget>[ Container( child: CallCast(), ), Container( child: SearchCast(), ), ]; void _onItemTapped(int index) { setState(() { _selectedIndex = index; }); } @override void initState() { super.initState(); } @override void didChangeDependencies() { super.didChangeDependencies(); } @override void setState(Function fn) { if (_alreadyDisposed) return; super.setState(fn); } @override void dispose() { _alreadyDisposed = true; super.dispose(); } @override Widget build(BuildContext context) { //下ナビだけ固定、appBarとbodyだけスクリーンを切り替え return Scaffold( //アプリバー appBar: _userHomeAppBar.elementAt(_selectedIndex), //コンテンツ body: _userHomeBody.elementAt(_selectedIndex), //下ナビゲーションバー bottomNavigationBar: BottomNavigationBar( type: BottomNavigationBarType.fixed, items: [ //呼ぶ BottomNavigationBarItem( icon: Stack( overflow: Overflow.visible, children: <Widget>[ Icon(IconCall.iconCall), Positioned( right: -15.0, child: Container( padding: EdgeInsets.all(1), decoration: new BoxDecoration( color: Colors.amber[800], borderRadius: BorderRadius.circular(10), ), constraints: BoxConstraints( minWidth: 20, minHeight: 20, ), child: new Text( '10', //通知の数 style: new TextStyle( color: Colors.white, fontSize: 9, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), ), ) ], ), title: Text('呼ぶ'), ), //探す BottomNavigationBarItem( icon: Icon(Icons.search), title: Text('探す'), ), ], currentIndex: _selectedIndex, selectedItemColor: Colors.black87, onTap: _onItemTapped, ), ); } }
▼問題の「探す」のクラス
//appBarに返す class GuestSearchAppBar extends StatefulWidget implements PreferredSizeWidget { GuestSearchAppBar({Key key}); Size get preferredSize => Size.fromHeight(40.0); _GuestSearchAppBarState createState() => _GuestSearchAppBarState(); } class _GuestSearchAppBarState extends State<GuestSearchAppBar> { @override Widget build(BuildContext context) { return AppBar( title: Container( padding: EdgeInsets.only(right: 12.0, left: 10.2), height: 80, ), backgroundColor: Colors.white, bottom: TabBar( tabs: _tab, ), ); } } //bodyに返す class SearchCast extends StatelessWidget { @override Widget build(BuildContext context) { return TabBarView(children: <Widget>[ TabPage(title: 'Car', icon: Icons.directions_car), TabPage(title: 'Bicycle', icon: Icons.directions_bike), TabPage(title: 'Boat', icon: Icons.directions_boat), ]); } } //TabPageの中身 class TabPage extends StatelessWidget { final IconData icon; final String title; const TabPage({Key key, this.icon, this.title}) : super(key: key); @override Widget build(BuildContext context) { final TextStyle textStyle = Theme.of(context).textTheme.display1; return Center( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Icon(icon, size: 64.0, color: textStyle.color), Text(title, style: textStyle), ], ), ); } }
このファイルから
Undefined name '_tab'.
Try correcting the name to one that is defined, or defining the name.
というエラーが出ます。(別クラスから指定しているのが原因なのは何となくわかるのですが)
Flutter初心者なもので、対処法がわからず困っています。
どのようにすれば実現可能なのでしょうか?
このような場合、例えばappBarを捨てて、bodyにまとめて上ナビバーも独自で作っても良いものなのでしょうか?
もし情報が足りなければ言ってください。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/09 16:33