当新闻提要为空时,我想在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
小部件中使用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()方法中引用窗口小部件的祖先,保存引用 调用祖先中的InheritFromFromWidgetOfExactType() 小部件的didChangeDependencies()方法。
有没有办法避免这种情况,从而不会引发任何错误?
由于某种原因,如果我在等待Navigator.push
之前致电function(document)
,则不会引发任何错误。但我不能允许这样做,因为它必须先在函数中执行数据验证,并且仅在成功时进行导航。
谢谢!
更新:
经过更多测试,我认为问题是由StreamBuilder
引起的。每当收到新事件时,它都会重建。因此,在调用Navigator.push
时会导致此问题,并且它会收到新事件,因此请尝试重建。
如何解决?可以阻止StreamBuilder
重建后代吗?
答案 0 :(得分:0)
之所以发生这种情况,是因为您在构建小部件树的同时试图导航到其他地方。
您应将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)));
}
});
}