【发布时间】:2019-07-21 00:10:51
【问题描述】:
当新闻提要为空时,我想在 Flutter 应用中实现 empty state page。
当提要中没有活动时,我想显示“没有活动”。当数据库有数据时,我想将这个从StreamBuilder加载到ListView.builder
我尝试使用:
child: StreamBuilder(
stream: collection.snapshots(),
builder: (context, snapshot) {
if(snapshot.hasData) {
return ListView.builder(
itemBuilder: (context, index) =>
build(context, snapshot.data.documents[index]),
itemCount: snapshot.data.documents.length,
);
} else {
return _emptyStateWidget();
}
我必须在 else 语句中返回一些东西,因为有时快照没有数据,所以会抛出 Widget 返回 null 的错误。
但这会导致小部件树出现问题。因为如果我稍后尝试在build Widget 中使用 Navigator.push:
Widget build(BuildContext context, DocumentSnapshot document) {
…
FlatButton(
onPressed: () async {
await function(document);
if(validated == true) {
await Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) =>
new Screen(documentInfo: documentInfo)));
}
抛出错误:
查找已停用小部件的祖先是不安全的。在此刻 小部件的元素树的状态不再稳定。为了安全 在其 dispose() 方法中引用小部件的祖先,保存引用 通过调用inheritFromWidgetOfExactType() 到祖先 小部件的 didChangeDependencies() 方法。
有没有办法避免这种情况,以免引发错误?
由于某种原因,如果我在等待 function(document) 之前调用 Navigator.push,则不会引发错误。但我不能允许这样做,因为它必须在函数之前执行数据验证,并且只有在成功时才能导航。
谢谢!
更新:
经过更多测试,我认为问题是由StreamBuilder 引起的。每当它获得新事件时,它都会重建。因此,当调用Navigator.push 并获得新事件时,这会导致问题,因此请尝试重建。
如何解决?是否可以阻止 StreamBuilder 重建后代?
【问题讨论】:
-
对于空状态返回
new Container(),这样它就不会给出任何错误。对于onPressed事件,请尝试将Navigation.push放入itemBuilder本身,方法是将documentInfo保存在var或任何你想要的东西中。 -
感谢您的回复!将
Navigation.push放入itemBuilder是什么意思?
标签: dart flutter future flutter-navigation