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
相关产品推荐
相关产品推荐

