Flutter中如何传递StatefulWidget数据并修复底部导航栏索引报错?
报错修复方案
错误原因
你声明的pageIdx为可空类型int?,但Dart语法要求列表下标、BottomNavigationBar的currentIndex参数必须传入非空的int值,空安全校验不通过触发报错。
修复步骤
- 取消State类的构造传参逻辑,State实例可直接通过
widget.属性获取父组件传递的参数,避免重复传参带来的空值风险 - 为
pageIdx设置非空默认值,无需使用可空类型声明 - 调整索引为2时的跳转逻辑,跳转新页面无需修改
pageIdx的值,避免返回当前页面时底部导航选中状态异常
修正后代码
class Body extends StatefulWidget { final int pageIdx; const Body({super.key, required this.pageIdx}); @override State<StatefulWidget> createState() => _MainContetns(); } class _MainContetns extends State<Body> { late int pageIdx; @override void initState() { super.initState(); pageIdx = widget.pageIdx; } final screens = [ // 你的页面组件配置 ]; @override Widget build(BuildContext context) { void _onItemTapped(int index) { if (index == 2) { Navigator.push( context, PageTransition( type: PageTransitionType.topToBottom, child: const Home())); return; } setState(() { pageIdx = index; }); } return Scaffold( body: screens[pageIdx], bottomNavigationBar: BottomNavigationBar( items: const <BottomNavigationBarItem>[ // 你的底部导航项配置 ], currentIndex: pageIdx, onTap: _onItemTapped, ), ); } }
如果你确实有需要保留pageIdx为可空类型的场景,可以在使用时通过??操作符指定默认非空值即可:
body: screens[pageIdx ?? 0], currentIndex: pageIdx ?? 0,
内容的提问来源于stack exchange,提问作者Sanghun Yang
相关产品推荐
相关产品推荐

