Flutter 跨类传递列表始终为空 底部导航关联页面传值异常
问题根源
onPressed回调中创建的MesFavorisOn实例未实际生效:该代码仅在回调作用域内生成了新的页面对象,既未绑定路由跳转逻辑,也未更新底部导航的页面列表,不会产生实际作用。- 底部导航页面列表配置写死了空数组:
_buildScreens方法中直接传入MesFavorisOn(arr: []),底部导航切换时永远使用这个传了空数组的实例,因此获取到的列表始终为空。
解决方案
根据使用场景分为两种实现方式:
场景1:点击按钮跳转至独立的MesFavorisOn页面(不使用底部导航的预置标签)
直接修改onPressed逻辑,通过路由传递列表并打开新页面即可:
onPressed: () { Navigator.of(context).push(MaterialPageRoute( builder: (context) => MesFavorisOn(arr: Items), )); }
该场景无需修改底部导航的原有配置。
场景2:点击按钮切换至底部导航的MesFavorisOn标签,且标签页需拿到更新后的列表
需要将共享列表抽到底部导航的父组件做状态管理,修改步骤如下:
- 在底部导航父组件的State类中定义可更新的列表变量:
List<Item> favorisArr = [];
- 修改
_buildScreens方法,使用上述变量传值,替换写死的空数组:
List<Widget> _buildScreens() { return [ ProchainesState(), MesEncheres(), MesFavorisOn(arr: favorisArr), Autres(), ]; }
- 在
Prochaines类中增加更新回调,点击按钮时将列表同步到父组件:
// Prochaines类构造函数新增参数 final Function(List<Item>) onFavorisUpdate; const Prochaines({super.key, required this.onFavorisUpdate}); // 按钮点击事件逻辑 onPressed: () { // 同步列表到父组件 onFavorisUpdate(Items); // 若需要同时切换到底部导航的MesFavorisOn标签,补充以下代码(currentIndex为底部导航当前选中索引的变量) // setState(() { currentIndex = 2; }); }
- 父组件初始化
Prochaines时传入回调,更新列表后触发重建:
List<Widget> _buildScreens() { return [ Prochaines( onFavorisUpdate: (list) { setState(() { favorisArr = list; }); } ), MesEncheres(), MesFavorisOn(arr: favorisArr), Autres(), ]; }
如果后续需要对列表做增删改操作,也可以直接修改父组件的favorisArr并调用setState,MesFavorisOn会自动拿到最新的列表数据。
内容的提问来源于stack exchange,提问作者Wassef Hassine
相关产品推荐
相关产品推荐

