当新闻提要为空时,我想在Flutter应用中实现empty state page。
当Feed中没有活动时,我想显示“没有活动”。当数据库有数据时,我想将它从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()方法中安全地引用窗口小部件的祖先,请通过在窗口小部件的didChangeDependencies()方法中调用inheritFromWidgetOfExactType()来保存对祖先的引用。
有没有办法避免这种情况,以免引发错误?
出于某种原因,如果我在等待Navigator.push
之前调用function(document)
,则不会抛出任何错误。但是我不能允许这样做,因为它必须在函数之前执行数据验证,并且只有在成功时才导航。
谢谢!
更新:
经过更多的测试,我认为问题是由StreamBuilder
造成的。每当它获得新事件时它就会重建。因此,当调用Navigator.push
并且它获得新事件时,这会导致问题,因此请尝试重建。
怎么解决?有可能阻止StreamBuilder
重建后代吗?
之所以发生这种情况,是因为您在构建窗口小部件树时尝试导航到其他位置。
您应该将Navigation.push
移动到流监听器,例如,在initState
中。
void initState() {
super.initState();
collection.snapshots.listen((data){
if(validated == true) {
await Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) =>
new Screen(documentInfo: documentInfo)));
}
});
}