空状态页面和导航器问题?

问题描述 投票:2回答:1

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

dart flutter future flutter-navigation
1个回答
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)));
  }
});

}
© www.soinside.com 2019 - 2024. All rights reserved.