Flutter页面切换报错:'0 <= currentIndex && currentIndex < items.length'不成立
错误原因
这个断言失败的核心问题是:BottomNavigationBar的currentIndex必须是其items数组的有效索引(范围0到items.length-1)。你的底部导航栏只有2个item(对应索引0、1),但点击Drawer的设置/帮助选项后,_currentIndex被设为2或3,超出了底部导航栏item的索引范围,直接触发了断言检查失败。
解决方案:拆分状态变量
用两个独立变量分别控制当前显示的页面和底部导航栏的选中状态,避免索引冲突:
- 替换原有索引变量:
// 原变量:int _currentIndex = 0; int _currentPageIndex = 0; // 控制当前显示的页面 int _selectedBottomNavIndex = 0; // 控制底部导航栏的选中项
- 修改底部导航栏配置:
bottomNavigationBar: BottomNavigationBar( onTap: (index) { setState(() { _selectedBottomNavIndex = index; _currentPageIndex = index; // 点击底部导航时同步页面 }); }, items: const [ BottomNavigationBarItem( icon: Icon(Icons.home), label: 'Home', ), BottomNavigationBarItem( icon: Icon(Icons.ad_units), label: 'Free Coin', ), ], currentIndex: _selectedBottomNavIndex, // 改用底部导航专属变量 selectedItemColor: Colors.amber[800], ),
- 更新Drawer的点击逻辑:
// 首页选项:同步底部导航选中状态 ListTile( leading: const Icon(Icons.home), title: const Text('Home'), onTap: () { setState(() { _currentPageIndex = 0; _selectedBottomNavIndex = 0; Navigator.of(context).pop(); }); }, ), // 设置选项:仅切换页面,不修改底部导航选中状态 ListTile( leading: const Icon(Icons.settings), title: const Text('Settings'), onTap: () { setState(() { _currentPageIndex = 2; Navigator.of(context).pop(); }); }, ), // 帮助选项:仅切换页面,不修改底部导航选中状态 ListTile( leading: const Icon(Icons.help), title: const Text('Help'), onTap: () { setState(() { _currentPageIndex = 3; Navigator.of(context).pop(); }); }, ),
- 修改body的页面索引:
body: SafeArea( child: pages[_currentPageIndex], ),
补充说明
BottomNavigationBar要求currentIndex必须是有效索引,无法设置为无效值来取消高亮。保持原有选中状态是更合理的做法,用户返回底部导航页面时能看到之前的选中位置。
内容的提问来源于stack exchange,提问作者RmTomal
相关产品推荐
相关产品推荐

