我正在尝试在我拥有的每个视图上显示 BottomNavigationBar,它正在工作,但这是一种“愚蠢”的方式......
我有一个自定义的 BottomNavigationBar,我将其插入到每个视图中。
var selectedIndex = 0;
class CustomBottombar extends StatefulWidget {
CustomBottombar({Key key}) : super(key: key);
@override
_CustomBottombarState createState() => _CustomBottombarState();
}
class _CustomBottombarState extends State<CustomBottombar> {
List _viewList = [FirstView(), SecondView()];
@override
Widget build(BuildContext context) {
return BottomNavigationBar(
currentIndex: selectedIndex,
onTap: _onItemTapped,
items: _items,
);
}
void _onItemTapped(int index) {
setState(() {
selectedIndex = index;
Navigator.of(context).popUntil((route) => route.isFirst
);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => _viewList[index]),
);
});
}
final _items = [
BottomNavigationBarItem(
icon: Icon(
Icons.refresh,
color: Color(0xFFACACAC),
size: 35,
),
title: Text("first")),
BottomNavigationBarItem(
icon: Icon(
Icons.phone,
color: Color(0xFFACACAC),
size: 35,
),
title: Text("second"),
),
BottomNavigationBarItem(
icon: Icon(
Icons.add_shopping_cart,
color: Color(0xFFACACAC),
size: 35,
),
title: Text("thrid"),
),
]; }
在 _onItemTapped 函数中,我从“Navigationstack”中弹出所有内容,然后显示我的项目中的屏幕。
在我的 FirstView() 中,我有这段代码
class FirstView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(""),
bottomNavigationBar: CustomBottombar(),
endDrawer: CustomDrawer(),
body: Center(
child: RaisedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => ContactView()),
);
},
child: Text('First'),
),
),
);
}
}
现在我想移动到不是底部导航栏中的项目的“ContactView”
class ContactState extends State<ContactView> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar("title"),
endDrawer: CustomDrawer(),
bottomNavigationBar: CustomBottombar(),
body: SafeArea(
bottom: true,
child: SingleChildScrollView(
child: Container(child: Text("Contact"),),
)),
);
}
}
我还会有很多不在 items 数组中的其他视图,但我想在其上显示 BottomNavigationBar。我的问题确实是这个功能。
void _onItemTapped(int index) {
setState(() {
selectedIndex = index;
Navigator.of(context).popUntil((route) => route.isFirst
);
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => _viewList[index]),
);
});
}
因为在这里我删除了导航历史以显示 Items Array 中的 View。有没有标准的方法可以做到这一点,希望有人可以提供帮助。
编辑: 澄清:我有 10 个屏幕。其中只有 3 个可以通过 BottomNavigationBar 导航,假设这 10 个中的前 3 个。现在我想从 Screen1 导航到 Screen4。导航栏在 screen4 上消失。我想在所有屏幕上保留导航栏。
编辑 2
@Dhaval Kansara 答案对我有用,但我遇到了一个新问题。我有一个enddrawer,在修复之前它位于BottomNavigationBar 上方,现在BottomNavigationBar 位于上方。
但我想要这样