Flutter父组件状态变更后子组件的Firestore Stream未更新问题
问题原因
initState 是 StatefulWidget 对应的 State 对象首次被创建时仅执行一次的生命周期回调。你在 initState 中初始化 _entryStream 后,即便父组件 Home 传入新的 date 参数重新构建 EntryList 实例,只要对应的 _EntryListState 没有被销毁重建,就不会再次执行 initState 更新 _entryStream,所以一直展示初始日期的数据,和 dispose 方法没有直接关系。
另外你的代码存在一处笔误:_EntryListState 的泛型参数写为了 EntriesList,需要修正为 EntryList 否则会触发编译错误。
解决方案
有两种常用的实现方式可选:
方式1:添加Key强制组件重建
每次date变化时给EntryList传入不同的Key,Flutter检测到Key变化就会销毁旧的State对象,创建新的State实例,自动执行新的initState拉取对应日期的数据流,改动量最小。
修改Home中EntryList的调用代码:
Row(children: [EntryList(key: ValueKey(date), this.date)]),
方式2:重写didUpdateWidget监听参数变化
在_EntryListState中重写didUpdateWidget方法,当组件接收到新参数时主动更新_entryStream,不需要重建组件,性能更好,适合子组件逻辑复杂、重建开销大的场景:
@override void didUpdateWidget(covariant EntryList oldWidget) { super.didUpdateWidget(oldWidget); // 检测date是否变化,变化则更新流 if (oldWidget.date != widget.date) { setState(() { _entryStream = FirebaseFirestore.instance .collection(widget.date) .snapshots(); }); } }
内容的提问来源于stack exchange,提问作者pythonNovice
相关产品推荐
相关产品推荐

