【问题标题】:how to keep bottom navigation bar in all pages with stateful widget in Flutter如何在 Flutter 中使用有状态小部件在所有页面中保留底部导航栏
【发布时间】:2022-10-24 21:58:37
【问题描述】:

我能够导航到所有页面上都有可见底部导航栏的多个不同页面,但无法在所有页面之间切换,那么如何在所有页面中都有底部栏的标签之间切换

我使用这个Answer 到了这里,但无法使其工作,即在底部导航选项卡之间切换......

简而言之,我想为我的消息选项卡添加视图,即第二个选项卡并移动到它,而不会丢失我导航到的每个页面的底部导航栏...

到目前为止我的代码,

import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: HomePage()));

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: BottomNavigationBar(
        backgroundColor: Colors.orange,
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.call), label: 'Call'),
          BottomNavigationBarItem(icon: Icon(Icons.message), label: 'Message'),
        ],
      ),
      body: Navigator(
        onGenerateRoute: (settings) {
          Widget page = Page1();
          if (settings.name == 'page2') page = Page2();
          return MaterialPageRoute(builder: (_) => page);
        },
      ),
    );
  }
}

// 1st Page:

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Page1')),
      body: Center(
        child: RaisedButton(
          onPressed: () => Navigator.pushNamed(context, 'page2'),
          child: Text('Go to Page2'),
        ),
      ),
    );
  }
}

// 2nd Page:

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) => Scaffold(appBar: AppBar(title: Text('Page2')));
}

【问题讨论】:

    标签: flutter dart flutter-layout tabnavigator flutter-bottomnavigation


    【解决方案1】:

    试试这样:

    class HomePage extends StatefulWidget {
      @override
      State<HomePage> createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      int activeIndex = 0;
      void changeActivePage(int index) {
        setState(() {
          activeIndex = index;
        });
      }
    
      List<Widget> pages = [];
    
      @override
      void initState() {
        pages = [
          Page1(() => changeActivePage(2)),
          Page2(),
          Page3(),
        ];
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            bottomNavigationBar: SizedBox(
              width: MediaQuery.of(context).size.width,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  IconButton(onPressed: () => changeActivePage(0), icon: Icon(Icons.call)),
                  IconButton(onPressed: () => changeActivePage(1), icon: Icon(Icons.message)),
                ],
              ),
            ),
            body: pages[activeIndex]);
      }
    }
    
    // 1st Page:
    
    class Page1 extends StatelessWidget {
      final Function callback;
    
      const Page1(this.callback);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Page1')),
          body: Center(
            child: RaisedButton(
              onPressed: () => callback(),
              child: Text('Go to Page3'),
            ),
          ),
        );
      }
    }
    
    // 2nd Page:
    
    class Page2 extends StatelessWidget {
      @override
      Widget build(BuildContext context) =>
          Scaffold(appBar: AppBar(title: Text('Page2')));
    }
    
    // 3rd Page:
    
    class Page3 extends StatelessWidget {
      const Page3();
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: Text('Page3')),
          body: Center(child: Text('Page3')),
        );
      }
    }
    

    【讨论】:

    • 感谢您的建议,但我想导航到另一个页面,比如第一个选项卡中的 page3,同时还要保持底部选项卡栏,这怎么可能是我的问题,比如在底部导航栏中有多个导航器
    • 好的,我编辑了我的解决方案,它应该是你现在所期望的,检查一下。
    • 它就像一个魅力......感谢一个吨人
    • 嘿,但是当我返回上一个选项卡时有一个问题,它会失去状态,就像我从选项卡 1 的第 3 页导航到选项卡 2 一样,当我再次返回选项卡 1 时它向我显示 tab1 第 1 页而不是它应该显示第 3 页因为这是我之前的导航堆栈
    • 是的,当然它是这样工作的,因为每次导航到每个页面都会重新创建。但是,如果您希望它表现得像那样,那么如果您希望第 1 页保留打开的第 3 页,您将如何返回到第 1 页呢?
    【解决方案2】:

    我能够使用 autoRoute 包找到解决方案。

    你可以继续看视频。

    https://www.youtube.com/watch?v=9oH42_Axr3Q

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2013-01-01
      • 2023-02-26
      • 2020-01-11
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多