【问题标题】:Empty state page and Navigator issues?空状态页面和导航器问题?
【发布时间】:2019-07-21 00:10:51
【问题描述】:

当新闻提要为空时,我想在 Flutter 应用中实现 empty state page

当提要中没有活动时,我想显示“没有活动”。当数据库有数据时,我想将这个从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() 方法中引用小部件的祖先,保存引用 通过调用inheritFromWidgetOfExactType() 到祖先 小部件的 didChangeDependencies() 方法。

有没有办法避免这种情况,以免引发错误?

由于某种原因,如果我在等待 function(document) 之前调用 Navigator.push,则不会引发错误。但我不能允许这样做,因为它必须在函数之前执行数据验证,并且只有在成功时才能导航。

谢谢!

更新:

经过更多测试,我认为问题是由StreamBuilder 引起的。每当它获得新事件时,它都会重建。因此,当调用Navigator.push 并获得新事件时,这会导致问题,因此请尝试重建。

如何解决?是否可以阻止 StreamBuilder 重建后代?

【问题讨论】:

  • 对于空状态返回new Container(),这样它就不会给出任何错误。对于onPressed 事件,请尝试将Navigation.push 放入itemBuilder 本身,方法是将documentInfo 保存在var 或任何你想要的东西中。
  • 感谢您的回复!将Navigation.push 放入itemBuilder 是什么意思?

标签: dart flutter future flutter-navigation


【解决方案1】:

发生这种情况是因为您在构建小部件树时试图导航到其他地方。

您应该将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)));
  }
});

}

【讨论】:

  • 感谢您的回复!但是validated 不是来自数据库。它是对从数据库中获取的数据执行操作的结果
  • 我在您的代码中找不到validated,但基本上这不是保留在这里的想法,而是您应该如何处理Navigator 与流。
  • 谢谢。但是validatedbool。我正在尝试使用流,但不认为可以在 bool 上使用流?
  • 我尝试使用你的方法,但看不到如何将你的流添加到我的StreamBuilder。怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多