【问题标题】:Flutter how to change the parent BottomNavigationBar index from a child widgetFlutter如何从子小部件更改父BottomNavigationBar索引
【发布时间】:2019-07-02 06:25:54
【问题描述】:

所以我最近开始了我在flutter中的第一个项目,我完成了完整的UI布局,现在正在做前端的整个逻辑部分,我的大部分onTap行为都在工作,但是我遇到了以下情况不知道怎么解决。

我有四个包含所有 UI 的文件。
widget0.dart
小部件1.dart
widget2.dart

这些文件每个都包含由 BottomNavigationBar 构建的 StatefullWidget。

ma​​in.dart
该文件包含我的 main() =>runApp 类和函数。我的 MaterialApp 包含一个带有 BottomNavigationBar 的脚手架。这按预期工作,我能够在 3 个小部件之间切换。

但是,在我的 widget0.dart 文件中,我有一个按钮,它应该将我的 main.dart 文件中的 BottomNavigationBar 的索引从 0 更改为 2(从 widget2.dart 构建小部件)。

我试图将保存导航栏索引的值封装在一个单独的静态类中,所以我可以在按钮 onTap() 中 setState((){ StaticClass.index = 2}),但这不起作用,实际上冻结了导航bar 到它的初始值。

stackoverflow 上某处的答案建议每个小部件都应该有自己的 Scaffold 和导航栏,但我相信一定有更清洁的方式。

那么实现我的目标的最 Fluttery 方式是什么?

提前致谢。

【问题讨论】:

    标签: user-interface dart flutter scaffold


    【解决方案1】:

    您可以将函数作为参数传递给 widget0,并且在该函数中可以像这样更改索引值:

    class ParentWidgetState extends State<ParentWidget> {
    
      int _index = 0;
    
      void goToWidget2() {
        setState(() {
              _index = 2;
            });
      }
    
      Widget body() {
        switch(_index) {
          case 0: 
            return Widget0(goToWidget2);
          case 1: 
            return Widget1();
          case 2: 
            return Widget2();
        }
        return Container();
      }
    
      @override
        Widget build(BuildContext context) {
          return Scaffold(
            body: body(),
            bottomNavigationBar: BottomNavigationBar(
            currentIndex: _index,
            items: [
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
              ),
              BottomNavigationBarItem(
                icon: Icon(Icons.home),
              ),
            ],
          ),
          );
        }
    }
    
    class Widget0 extends StatelessWidget {
      Widget0(this.goToWidget2);
      final void Function() goToWidget2;
      @override
        Widget build(BuildContext context) {
          return Center(child: FlatButton(
            onPressed: goToWidget2,
            child: Text("Go To Widget 2"),
          ),);
        }
    }
    class Widget1 extends StatelessWidget {
      @override
        Widget build(BuildContext context) {
          return Center(child: Text("widget 1"),);
        }
    }
    class Widget2 extends StatelessWidget {
      @override
        Widget build(BuildContext context) {
          return Center(child: Text("widget 2"),);
        }
    }
    

    【讨论】:

    • 是否可以将参数(int、string 等)作为回调函数的参数传递?如果是这样,那将如何实施?
    • 这不适用于今天的颤振。这对我来说一直是个问题。
    • @BhikkhuSubhuti 它应该仍然有效。如果您在堆栈溢出代码中发布问题并将链接粘贴到此处,我可以看一下!
    • @dshukertjr 我终于让它工作了。我认为现代颤振不允许这段代码工作..因为我试图用空安全和其他“现代”设置来编译它。这是我在 stackOverflow 上的问题。解决了stackoverflow.com/questions/68792794/…
    • @BhikkhuSubhuti 感谢您指出。我编辑了我的答案以使其发挥作用。
    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多