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

Flutter如何将更新后的数据传递给initState中初始化的页面组件

问题原因

你在initState中一次性初始化了_pages列表,而initState只会在State实例首次创建时执行1次,此时你传给StepTwo的_stepVals是初始的空Map。后续你调用setState更新_stepVals的时候,_pages列表里已经创建好的StepTwo实例不会自动更新入参,所以它拿到的永远是初始值。

解决方法

不要把页面列表作为State的持久化属性存储,改为在build方法中动态生成页面,或者直接根据选中索引返回对应组件,这样每次setState触发重绘时,都会用最新的_stepVals创建组件,自然就能拿到更新后的值。

修改后的代码示例:

class _AddPlanState extends State<AddPlan> {
  int _selectedIndex = 0;
  Map<dynamic, dynamic> _stepVals = {};

  _setSelectedIndex(int newIndex, Map<dynamic, dynamic> newMap) {
    setState(() {
      _stepVals = {..._stepVals, ...newMap};
      _selectedIndex = newIndex;
    });
  }

  @override
  void initState() {
    super.initState();
    // 移除原有的_pages初始化逻辑
  }

  @override
  Widget build(BuildContext context) {
    // 直接在build里根据索引返回对应组件
    Widget currentPage;
    if (_selectedIndex == 0) {
      currentPage = StepOne(_setSelectedIndex);
    } else {
      currentPage = StepTwo(_stepVals, _setSelectedIndex);
    }
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        backgroundColor: Colors.transparent,
      ),
      body: Container(
        margin: EdgeInsets.only(top: 10),
        padding: EdgeInsets.symmetric(horizontal: 10),
        child: currentPage,
      ),
    );
  }
}

如果你的页面数量较多,也可以在build方法内动态生成页面列表:

@override
Widget build(BuildContext context) {
  final _pages = [
    StepOne(_setSelectedIndex),
    StepTwo(_stepVals, _setSelectedIndex)
    // 后续新增页面直接加在这里即可
  ];
  return Scaffold(
    // 其他代码保持不变
    body: Container(
      margin: EdgeInsets.only(top: 10),
      padding: EdgeInsets.symmetric(horizontal: 10),
      child: _pages[_selectedIndex],
    ),
  );
}

内容的提问来源于stack exchange,提问作者X 2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:36:04