如何解决如何在 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 举报,一经查实,本站将立刻删除。