一个混合模式的Flutter Bottom Navigation bar
A mixed mode Flutter Bottom Navigation bar
我想在我的应用程序中包含一个底部导航栏,它将显示在某些页面上而不是其他页面上。
据我了解,Flutter BottomNavigationBar 小部件会重新呈现 Scaffold Body 属性 并且实际上不会路由到另一个页面并始终显示导航栏。有没有人对我如何拥有如下所示的底部导航有一些建议,其中 Tab 1 和 Tab 3 路由到显示导航栏的屏幕,而 Tab 2 和 Tab 3 是不显示导航栏的屏幕?
Bottom Navigation Bar
也许这会对你有所帮助:
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int pageIndex = 0;
final pages = [
const Page1(),
const Page2(),
const Page3(),
const Page4(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xffC4DFCB),
appBar: AppBar(
leading: Icon(
Icons.menu,
color: Theme.of(context).primaryColor,
),
title: Text(
"Bottom Navigation bar",
style: TextStyle(
color: Theme.of(context).primaryColor,
fontSize: 25,
fontWeight: FontWeight.w600,
),
),
centerTitle: true,
backgroundColor: Colors.white,
),
body: pages[pageIndex],
bottomNavigationBar: buildMyNavBar(context),
);
}
Container buildMyNavBar(BuildContext context) {
return Container(
height: 60,
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 0;
});
},
icon: pageIndex == 0
? const Icon(
Icons.home_filled,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.home_outlined,
color: Colors.white,
size: 35,
),
),
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 1;
});
},
icon: pageIndex == 1
? const Icon(
Icons.work_rounded,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.work_outline_outlined,
color: Colors.white,
size: 35,
),
),
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 2;
});
},
icon: pageIndex == 2
? const Icon(
Icons.widgets_rounded,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.widgets_outlined,
color: Colors.white,
size: 35,
),
),
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 3;
});
},
icon: pageIndex == 3
? const Icon(
Icons.person,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.person_outline,
color: Colors.white,
size: 35,
),
),
],
),
);
}
}
class Page1 extends StatelessWidget {
const Page1({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 1",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
class Page2 extends StatelessWidget {
const Page2({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 2",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
class Page3 extends StatelessWidget {
const Page3({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 3",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
class Page4 extends StatelessWidget {
const Page4({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 4",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
我相信您想在选项卡 1 和 3 中显示 bottomNavBar 而在选项卡 2 和 4 中隐藏它,对吗?我假设您有一个跟踪所选索引的变量,我们称它为 int _selectedIndex = 0
。在bottomNavigation 属性你可以像下面这样显示和不显示
bottomNavigationBar: _selectedIndex.isEven ? null: BottomNavigationBar()
这里它检查 _selectedIndex 值(在本例中为 0、1、2、3),如果是奇数,则显示页面和导航(选项卡 1 和 3),如果是偶数(选项卡 2 和4) 然后你提供一个 null
从而不显示导航。唯一关心的是如何在没有导航的情况下导航到两个选项卡之外,但这应该可以解决您眼前的问题
我想在我的应用程序中包含一个底部导航栏,它将显示在某些页面上而不是其他页面上。 据我了解,Flutter BottomNavigationBar 小部件会重新呈现 Scaffold Body 属性 并且实际上不会路由到另一个页面并始终显示导航栏。有没有人对我如何拥有如下所示的底部导航有一些建议,其中 Tab 1 和 Tab 3 路由到显示导航栏的屏幕,而 Tab 2 和 Tab 3 是不显示导航栏的屏幕?
Bottom Navigation Bar
也许这会对你有所帮助:
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int pageIndex = 0;
final pages = [
const Page1(),
const Page2(),
const Page3(),
const Page4(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xffC4DFCB),
appBar: AppBar(
leading: Icon(
Icons.menu,
color: Theme.of(context).primaryColor,
),
title: Text(
"Bottom Navigation bar",
style: TextStyle(
color: Theme.of(context).primaryColor,
fontSize: 25,
fontWeight: FontWeight.w600,
),
),
centerTitle: true,
backgroundColor: Colors.white,
),
body: pages[pageIndex],
bottomNavigationBar: buildMyNavBar(context),
);
}
Container buildMyNavBar(BuildContext context) {
return Container(
height: 60,
decoration: BoxDecoration(
color: Theme.of(context).primaryColor,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 0;
});
},
icon: pageIndex == 0
? const Icon(
Icons.home_filled,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.home_outlined,
color: Colors.white,
size: 35,
),
),
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 1;
});
},
icon: pageIndex == 1
? const Icon(
Icons.work_rounded,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.work_outline_outlined,
color: Colors.white,
size: 35,
),
),
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 2;
});
},
icon: pageIndex == 2
? const Icon(
Icons.widgets_rounded,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.widgets_outlined,
color: Colors.white,
size: 35,
),
),
IconButton(
enableFeedback: false,
onPressed: () {
setState(() {
pageIndex = 3;
});
},
icon: pageIndex == 3
? const Icon(
Icons.person,
color: Colors.white,
size: 35,
)
: const Icon(
Icons.person_outline,
color: Colors.white,
size: 35,
),
),
],
),
);
}
}
class Page1 extends StatelessWidget {
const Page1({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 1",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
class Page2 extends StatelessWidget {
const Page2({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 2",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
class Page3 extends StatelessWidget {
const Page3({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 3",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
class Page4 extends StatelessWidget {
const Page4({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
color: const Color(0xffC4DFCB),
child: Center(
child: Text(
"Page Number 4",
style: TextStyle(
color: Colors.green[900],
fontSize: 45,
fontWeight: FontWeight.w500,
),
),
),
);
}
}
我相信您想在选项卡 1 和 3 中显示 bottomNavBar 而在选项卡 2 和 4 中隐藏它,对吗?我假设您有一个跟踪所选索引的变量,我们称它为 int _selectedIndex = 0
。在bottomNavigation 属性你可以像下面这样显示和不显示
bottomNavigationBar: _selectedIndex.isEven ? null: BottomNavigationBar()
这里它检查 _selectedIndex 值(在本例中为 0、1、2、3),如果是奇数,则显示页面和导航(选项卡 1 和 3),如果是偶数(选项卡 2 和4) 然后你提供一个 null
从而不显示导航。唯一关心的是如何在没有导航的情况下导航到两个选项卡之外,但这应该可以解决您眼前的问题