如何在 Tab 中建立导航/页面,BottomNavigationBar 存储标签的当前情况?

问题描述

我的问题

我想使用 BottomNavigation 并且我还想保存当前导航(我想使用多个页面包括导航和属于脚手架的所有内容)和选择。需要使用 PopUpMenu 并关闭外部脚手架(“外部脚手架”在下一段中解释) - 由于注销功能关闭。在脚手架中使用脚手架不允许我从内部关闭外部。另一个问题是,Android 有后退按钮。如果你按下这个按钮,应用程序关闭,因为“backbutton-pressed-event”(由 Widget WillPopScope 捕获)关闭了整个应用程序,因为只有外部脚手架受到从 android 按下这个后退按钮的影响,但这个按钮应该有效在标签中导航的内部。

当前方式

我正在使用BottomNavigationBarTab (PersistentTabs) 的预定义类来存储当前选项卡情况。目前我使用 Scaffold 作为基础。我也在标签页上使用了脚手架,所以它是脚手架中的脚手架,这导致了我上面描述的问题。 因此,我通过使用 WillPopScope 从 android 按下后箭头并存储选项卡的当前页面解决关闭应用程序的问题。但是我仍然无法从内部 Scaffold(选项卡中的页面关闭应用程序。

基础脚手架

带有底部导航和控件的页面

Test.shouldPop 是一个 int,它应该可以帮助我检查是否可以关闭外部 Scaffold。

WillPopScope(
      onWillPop: () async {
        if(Test.shouldPop == 0 || currentTabIndex == 0 || currentTabIndex == 2) {
          return true;
        }
        return false;
      },child: Scaffold(
        body: PersistentTabs(
          currentTabIndex: currentTabIndex,screenWidgets: [NotesHome(uid: widget.uid),AreaOverviewPage(uid: widget.uid),StatisticsHome()],),bottomNavigationBar: BottomNavigationBar(
          selectedItemColor: AppColors.mainAccent,onTap: setCurrentIndex,currentIndex: currentTabIndex,items: [
            BottomNavigationBarItem(),BottomNavigationBarItem(),],)

持久标签

class PersistentTabs extends StatelessWidget {
  const PersistentTabs({@required this.screenWidgets,this.currentTabIndex = 0});
  final int currentTabIndex;
  final List<Widget> screenWidgets;

  List<Widget> _buildOffstageWidgets() {
    return screenWidgets
        .map(
          (w) => Offstage(
        offstage: currentTabIndex != screenWidgets.indexOf(w),child: Navigator(
          onGenerateRoute: (routeSettings) {
            return MaterialPageRoute(builder: (_) => w);
          },)
        .toList();
  }
  
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: _buildOffstageWidgets(),);
  }
}

示例页面 1

页面是此标签的主页。

Widget build(BuildContext context){
    Test.shouldPop = 0;

    double screenHeight = MediaQuery.of(context).size.height - 80;
    startPagePopUpMenu _selection = startPagePopUpMenu.logout;

    return FutureBuilder(
        future: connectToFirebase(),builder: (context,snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return SplashScreen();
          } else {
            return WillPopScope(
              onWillPop: () async {
                Test.shouldPop = 0;
                return false;
              },child: Scaffold(
                body: SafeArea(
                  top: true,bottom: true,child: SingleChildScrollView(
                    child: Padding(
                      padding: EdgeInsets.all(40),child: Container(
                        height: screenHeight,child: Column(
                          children: [
                            Container(
                              height: 30,child: Row(
                                mainAxisAlignment: MainAxisAlignment.spaceBetween,children: [
                                  Text(
                                    "App Name",style: TextStyle(
                                        fontWeight: FontWeight.bold,fontSize: 20.0),PopupMenuButton<startPagePopUpMenu>(
                                    onSelected: (startPagePopUpMenu result) {
                                      setState(() {
                                        _selection = result;
                                      });
                                    },itemBuilder: (BuildContext context) =>
                                        <PopupMenuEntry<startPagePopUpMenu>>[
                                      PopupMenuItem<startPagePopUpMenu>(
                                        value: startPagePopUpMenu.logout,child: Row(
                                          children: <Widget>[
                                            Icon(Icons.exit_to_app_rounded),Text(" logout")
                                          ],)
                                ],SizedBox(
                              height: 30,Container(
                                height: screenHeight -
                                    91 -
                                    kBottomNavigationBarHeight,child: StreamBuilder(
                                    stream: database.getData(),snapshotData) {
                                      // Here's a Widget,which opens Example Page 2
                                    })),);
          }
        });
}

示例页面 2

页面使用小部件打开

    Test.shouldPop = 1;

    double screenHeight = MediaQuery.of(context).size.height - 80;

    return FutureBuilder(
      future: connectToFirebase(),snapshot) {
        if (snapshot.connectionState != ConnectionState.waiting) {
          return Scaffold(
            body: SafeArea(
              top: true,child: SingleChildScrollView(
                child: Padding(
                  padding: EdgeInsets.all(40),child: Container(
                    height: screenHeight,child: Column(
                      children: [
                        Container(
                          height: 30,child: Row(
                            mainAxisAlignment: MainAxisAlignment.start,children: [
                              InkWell(
                                onTap: () {
                                  Test.shouldPop = 0;
                                  Navigator.pop(context);
                                },child: Row(
                                  children: [
                                    Icon(Icons.arrow_back_ios_rounded),Text(
                                      "some stuff",style: TextStyle(
                                          fontWeight: FontWeight.bold,SizedBox(
                          height: 30,Container(
                            height:
                                screenHeight - 91 - kBottomNavigationBarHeight,child: StreamBuilder(
                                stream: database.getData(),dataSnapshot) {
                                  
                                })),);
        } else {
          return SplashScreen();
        }
      },);

希望一切都可以理解或遗漏信息,否则随时问!感谢您的帮助和努力!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...