空状态页和导航器问题?

时间:2019-02-27 09:57:15

标签: dart flutter future flutter-navigation

当新闻提要为空时,我想在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重建后代吗?

1 个答案:

答案 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)));
  }
});

}