You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:24:04