如何在颤动的底部导航栏中添加抽屉?

Posted

技术标签:

【中文标题】如何在颤动的底部导航栏中添加抽屉?【英文标题】:How to add drawer in bottom navigation bar in flutter? 【发布时间】:2020-06-06 19:48:29 【问题描述】:

我想在用户点击第四个(more_vert)图标时显示一个抽屉,但我无法实现它。在我当前的实现中,当单击第 4 个图标时,flutter 会将我带到一个新页面,并显示抽屉不在当前屏幕上。我究竟做错了什么 ?另外,BottomNavigationBar 和 BottomAppBar 之间的区别是什么,我在任何地方都找不到区别。我查看了几篇文章,我认为 BottomAppBar 用于显示 Fab 浮动在底部应用程序栏中。两者之间是否还有其他区别,何时应该使用一种而不是另一种。

class Home extends StatefulWidget 
  @override
  _HomeState createState() => _HomeState();


class _HomeState extends State<Home> 
  List<Widget> _widgetOptions = <Widget>[
    Page1(),
    Page2(),
    Page3(),
    Page4(),   // this page implements the drawer

  ];
  int _currentSelected = 0;

  void _onItemTapped(int index) 
    setState(() 
      _currentSelected = index;
    );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: _widgetOptions.elementAt(_currentSelected),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        onTap: _onItemTapped,
        currentIndex: _currentSelected,
        showUnselectedLabels: true,
        unselectedItemColor: Colors.grey[800],
        selectedItemColor: Color.fromRGBO(10, 135, 255, 1),
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
             icon: Icon(AntDesign.carryout),
          ),
          BottomNavigationBarItem(
             icon: Icon(MaterialCommunityIcons.sack),
          ),
          BottomNavigationBarItem(
             icon: Icon(Octicons.archive),
          ),
          BottomNavigationBarItem(
             icon: Icon(Icons.more_vert),
          )
        ],
      ),
      // backgroundColor: Colors.black,
    );
  

【问题讨论】:

你有没有检查过这个可以帮助你的链接:***.com/questions/56007613/… 【参考方案1】:

您不需要额外的页面。 你可以这样做:

class Home extends StatefulWidget 
  @override
  _HomeState createState() => _HomeState();


class _HomeState extends State<Home> 
  List<Widget> _widgetOptions = <Widget>[
    Page(),
    Page(),
    Page(),
  ];
  int _currentSelected = 0;
  GlobalKey<ScaffoldState> _drawerKey = GlobalKey();

  void _onItemTapped(int index) 
    index == 3
        ? _drawerKey.currentState.openDrawer()
        : setState(() 
            _currentSelected = index;
          );
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      key: _drawerKey,
      body: _widgetOptions.elementAt(_currentSelected),
      drawer: Drawer(),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        onTap: _onItemTapped,
        currentIndex: _currentSelected,
        showUnselectedLabels: true,
        unselectedItemColor: Colors.grey[800],
        selectedItemColor: Color.fromRGBO(10, 135, 255, 1),
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            title: Text('Page 1'),
            icon: Icon(Icons.access_alarm),
          ),
          BottomNavigationBarItem(
            title: Text('Page 2'),
            icon: Icon(Icons.accessible),
          ),
          BottomNavigationBarItem(
            title: Text('Page 3'),
            icon: Icon(Icons.adb),
          ),
          BottomNavigationBarItem(
            title: Text('Drawer'),
            icon: Icon(Icons.more_vert),
          )
        ],
      ),
    );
  


class Page extends StatelessWidget 
  const Page(Key key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return Container();
  

为实现抽屉的 Scaffold 添加 GlobalKey 并在根 Scaffold 中实现 Drawer。

【讨论】:

【参考方案2】:

BottomNavigationBar 不像 AppBar 那样显示抽屉图标。

以编程方式打开抽屉:

将此变量创建为状态:

GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey();

将其设置为 Scaffold 的键:

Scaffold(
      key: _scaffoldKey,

然后,就可以用钥匙状态打开抽屉了:

_scaffoldKey.currentState.openDrawer();

【讨论】:

以上是关于如何在颤动的底部导航栏中添加抽屉?的主要内容,如果未能解决你的问题,请参考以下文章

如何将底部导航栏添加到此颤动代码

使用底部应用栏标签导航 - 颤动

颤动中的不同导航栏

如何使用同一个应用制作抽屉式导航和底部导航?

如何在颤动中隐藏android的底部导航栏

如何使用颤动的底部导航栏导航到几个新页面?