我正面临一个问题。我想做一个Flutter应用程序,所有页面都将显示在Android Fragment中。
我已经创建了一个列表,
int _currentIndex = 0;
List<Widget> pages = [
const HomeMain(),
const AdPage(),
const ImageCleanPage(),
const HomeMain(),
];
我在这里列出了4页。我还创建了一个抽屉和底部导航栏。我试着从底部的导航栏里找到0和1页,从抽屉里找到0,2,3页,就像碎片一样.
我试过这个密码
drawer: SafeArea(
child: Drawer(
child: Container(
color: Colors.white,
child: ListView(
children: [
DrawerHeader(
decoration: const BoxDecoration(
color: Colors.indigoAccent
),
child: Column(
children: [
Container(
width: 70,
height: 70,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(50),
border: Border.all(
color: Colors.white,
width: 2.0),
image: const DecorationImage(
image: AssetImage('assets/images/logo_image.png'),
)
),
),
const SizedBox(height: 15,),
const Text("Image Cleaner",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold, fontSize: 15,
),),
const SizedBox(height: 2,),
const Text("support.imageclean@gmail.com",
style: TextStyle(
color: Colors.white,
fontSize: 12,
decorationThickness: 15,
),)
],
),
),
ListBody(
children: [
ListTile(
leading: const Icon(Icons.home),
title: const Text('Home'),
onTap: () {
setState(() {
_currentIndex = 0;
Navigator.of(context).pop();
// Do something when the home page is tapped.
});
},
),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('Settings'),
onTap: () {
setState(() {
_currentIndex = 2;
Navigator.of(context).pop();
// Do something when the home page is tapped.
});
},
),
ListTile(
leading: const Icon(Icons.help),
title: const Text('Help'),
onTap: () {
setState(() {
_currentIndex = 3;
Navigator.of(context).pop();
// Do something when the home page is tapped.
});
},
),
],
)
],
),
),
),
),
bottomNavigationBar: BottomNavigationBar(
onTap: NavClick,
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.ad_units),
label: 'Free Coin',
),
],
currentIndex: _currentIndex,
selectedItemColor: Colors.amber[800],
),
backgroundColor: Colors.white,
body: SafeArea(
child: pages[_currentIndex],
)
);
}
void NavClick(int index) {
setState(() {
_currentIndex = index;
});
}
当我从抽屉中点击索引2时,我得到了这个错误,
Failed assertion: line 207 pos 15: '0 <= currentIndex && currentIndex < items.length': is not true.
2条答案
按热度按时间uujelgoq1#
BottomNavigationBar
始终需要在items
的数量范围内具有currentIndex
。所以在你的代码中这里有2个
items
。这意味着currentIndex
必须是0或1。但是你的代码使它在通过抽屉制作currentIndex
2时超出了这个范围。注意,你也不能让它“取消选择”或什么的。因此,即使您想要索引2,您也需要在底部栏中选择0或1。要消 debugging 误,您可能需要更改行到
使其在超出范围时回落到0
r1zhe5dt2#
您遇到的错误表明当前索引值
_currentIndex
超出了BottomNavigationBar
中的项目范围。在本例中,BottomNavigationBar
中有两个项目,但在抽屉中选择“设置”时将_currentIndex
设置为2。这将导致Assert失败,因为对于当前配置,有效索引范围应介于0和1之间(包括0和1)。要解决此问题,需要调整Drawer中
ListTile
小部件的onTap
回调中的索引值。以下是您应该进行的更改:对于“主页”选项,将
_currentIndex
设置为0。对于“设置”选项,将
_currentIndex
设置为1。对于“帮助”选项,将
_currentIndex
设置为2。通过进行这些调整,您将确保
_currentIndex
值保持在BottomNavigationBar
的有效范围内。这将解决您遇到的错误,并允许您的应用程序正常运行。