我想实施空状态页 https://material.io/design/communication/empty-states.html#content在 Flutter 应用程序中,当新闻源为空时。
当提要中没有活动时,我想显示‘没有活动’。当数据库有数据时,我想从StreamBuilder
to 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 的错误。
但这会导致小部件树出现问题。因为如果我尝试使用 Navigator.pushbuild
稍后小部件:
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()到祖先
小部件的 didChangeDependency() 方法。
有没有办法避免这种情况,以免引发错误?
出于某种原因如果我打电话Navigator.push
在等待之前function(document)
没有抛出错误。但我不能允许这样做,因为它必须之前在函数中执行数据验证,并且只有在成功时才导航。
Thanks!
UPDATE:
经过更多测试后,我认为问题是由StreamBuilder
。每当收到新事件时它都会重建。所以这会导致调用时出现问题Navigator.push
它得到了新事件,所以尝试重建。
怎么解决?是否可以停止StreamBuilder
从重建后代?