我试图在应用程序的初始页面中构建一个底部导航栏,我在该底部栏中添加了多个标签,用户应该可以点击其中的一个以进入不同的标签。但是,该栏只能导航到其他页面。在其中一个页面中,我添加了card
,用户应点击它们以详细显示页面。但是,在详细信息页面中时,导航栏消失了。我想知道如何使导航栏在应用程序中始终可见。
下面的代码是关于如何在首页中建立底部栏的,
......
int currentTab = 0; // to keep track of active tab index
final List<Widget> screens = [
recommend(),
optional(),
backtest(),
machine(),
]; // to store tab views
Widget currentScreen = recommend(); // initial pages
final PageStorageBucket bucket = PageStorageBucket();
......
bottomNavigationBar: BottomAppBar(
color: Colors.white,
elevation: 0.2,
shape: CircularNotchedRectangle(),
notchMargin: 10,
child: Container(
height: 60,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
MaterialButton(
minWidth: 40,
onPressed: (){
setState(() {
currentScreen = recommend();
currentTab = 0;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.format_line_spacing,
color: currentTab == 0 ? Colors.redAccent : Colors.grey,),
Text(
'',
style: TextStyle(
color: currentTab == 0 ? Colors.redAccent : Colors.grey, ),)
],),
),
MaterialButton(
minWidth: 40,
onPressed: (){
setState(() {
currentScreen = optional();
currentTab = 1;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.offline_pin,
color: currentTab == 1 ? Colors.redAccent : Colors.grey,),
Text(
'',
style: TextStyle(
color: currentTab == 1 ? Colors.redAccent : Colors.grey, ),)
],),
),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
MaterialButton(
minWidth: 40,
onPressed: (){
setState(() {
currentScreen = backtest();
currentTab = 2;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.replay,
color: currentTab == 2 ? Colors.redAccent : Colors.grey,),
Text(
'',
style: TextStyle(
color: currentTab == 2 ? Colors.redAccent : Colors.grey, ),)
],),
),
MaterialButton(
minWidth: 40,
onPressed: (){
setState(() {
currentScreen = machine();
currentTab = 3;
});
},
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(
Icons.android,
color: currentTab == 3 ? Colors.redAccent : Colors.grey,),
Text(
'',
style: TextStyle(
color: currentTab == 3 ? Colors.redAccent : Colors.grey, ),)
],),
),
],
)
],
),
),
),
下面的代码是我导航至详细信息页面的方式,
return Container(
child: Card(
child: new InkWell(
onTap: (){
Navigator.push(context,
MaterialPageRoute(builder: (context) => stockDetail()));
},
......
我正在寻找一种基于现有代码解决问题的方法,但是如果还有其他有效的解决方法,我将不胜感激。
答案 0 :(得分:1)
使用此插件Presistant_bottom_nav_bar。基于问题,您需要每页都有bottomnav栏。您可以在链接上方的特定屏幕结帐中禁用bottomnav
我认为这是一个非常好的插件。在此链接中可以查看导航样式。您可以更改bottomnavbar navBarStyle的设计:NavBarStyle.style9,只需将style9更改为插件提供的任何数字即可。我相信其中有15个可用
您可以使用自定义图标代替默认图标,也可以代替CupertinoColors.systemPurple,也可以使用Colors.red这种类型,让我知道它是否有效
PersistentTabController _controller =PersistentTabController(initialIndex: 0);
//Screens for each nav items.
List<Widget> _NavScreens() {
return [
recommend(),
optional(),
backtest(),
machine(),
];
}
List<PersistentBottomNavBarItem> _navBarsItems() {
return [
PersistentBottomNavBarItem(
icon: Icon(Icons.home),
title: ("Recommend"),
activeColor: CupertinoColors.activeBlue,
inactiveColor: CupertinoColors.systemGrey,
),
PersistentBottomNavBarItem(
icon: Icon(Icons.favorite),
title: ("Optional"),
activeColor: CupertinoColors.activeGreen,
inactiveColor: CupertinoColors.systemGrey,
),
PersistentBottomNavBarItem(
icon: Icon(Icons.person_pin),
title: ("Backtest"),
activeColor: CupertinoColors.systemRed,
inactiveColor: CupertinoColors.systemGrey,
),
PersistentBottomNavBarItem(
icon: Icon(Icons.local_activity),
title: ("Machine"),
activeColor: CupertinoColors.systemIndigo,
inactiveColor: CupertinoColors.systemGrey,
),
];
}
@override
Widget build(BuildContext context) {
return Center(
child: PersistentTabView(
controller: _controller,
screens: _NavScreens(),
items: _navBarsItems(),
confineInSafeArea: true,
backgroundColor: Colors.white,
handleAndroidBackButtonPress: true,
resizeToAvoidBottomInset: true,
hideNavigationBarWhenKeyboardShows: true,
decoration: NavBarDecoration(
borderRadius: BorderRadius.circular(10.0),
),
popAllScreensOnTapOfSelectedTab: true,
navBarStyle: NavBarStyle.style9,
),
);
}
答案 1 :(得分:0)
我遇到了类似的问题。据我从您的查询中了解到的是,在不同的选项卡(底部导航栏中)中调用了不同的页面,但是应用程序栏/底部导航栏本身不可见。
我建议您创建另一个镖文件。为了方便起见,我们说blank.dart
。在此blank.dart中,为底部导航栏(您已经编写的)编写代码,并调用此blank.dart中的所有不同页面
因此,基本上,导航栏对于在该blank.dart中将被调用的所有其他页面是通用的。
您可以将其理解为blank.dart是父级,所有其他不同的选项卡是其子级,因此父级可以导航到其子级小部件。
您可以在lib / screens / blank.dart中查看我的GitHub,以获取类似的解决方案:http://github.com/samflab/fitility
答案 2 :(得分:0)
您好,您可以通过在 main.dart 中添加 BottomNavigationBar 来解决这个问题,然后根据 BottomNavigationBaritem 的 currentIndex 您可以更改 scaffold(body:anyScreenAccordingToindex) 中的屏幕。例如,如果 currentIndex==2 则 body:secondPage()< /p>