繁体   English   中英

被关闭的 Dismissible 小部件仍然是树的一部分

[英]A dismissed Dismissible widget is still part of the tree

关于这个错误似乎有很多问题,但我还没有找到适合我的情况的答案。

我看到的行为是 Dismissible 工作,它触发并删除项目,但有一段时间它在 ListView 中显示错误。 我猜它正在等待树根据 Stream<List> 更新,这反过来又从 Firebase 中删除记录。

我的流构建器...

return StreamBuilder<List<Person>>(
      stream: personBloc.personsByUserId(userId),
      builder: (context, snapshot) {

...

}

我的 ListView.builder()

ListView.builder(
                      itemCount: snapshot.data.length,
                      itemBuilder: (context, index) {
                        var person = snapshot.data[index];

                        return GestureDetector(
                          onTap: () {
                            Navigator.of(context)
                                .pushNamed('/reading/${person.personId}');
                          },
                          child: Dismissible(
                            key: Key(person.personId),
                            direction: DismissDirection.endToStart,
                            onDismissed: (direction) {
                              personBloc.deletePerson(person.personId);
                            },
                            background: Container(
                              child: Padding(
                                padding: const EdgeInsets.all(15.0),
                                child: Row(
                                  mainAxisAlignment: MainAxisAlignment.end,
                                  children: [
                                    Icon(
                                      FontAwesomeIcons.trash,
                                      color: Colors.white,
                                    ),
                                    Text(
                                      'Delete',
                                      style: TextStyle(color: Colors.white),
                                      textAlign: TextAlign.right,
                                    ),
                                  ],
                                ),
                              ),
                              color: Colors.red,
                            ),
                            child: AppCard(
                              //Bunch of properties get set here
                            ),
                          ),
                        );
                      },
                    

我的删除人

  deletePerson(String personId) async {
    fetchPersonId(personId).then((value) {
      if (value.imageUrl.isNotEmpty) {
        removeImage();
      }

      db.deletePerson(personId);
    });
  }

我试过将 onDismissed 更改为 confirmDismiss ,但没有运气。

在此处输入图片说明

有什么建议?

当您使用Dismissible小部件关闭但尚未从ListView.builder使用的列表中删除项目时,就会发生这种情况。 如果您的列表存储在本地,延迟不是问题,您可能永远不会看到这个问题,但是因为您使用的是Firestore (我假设,根据您提到的Firebase ),那么询问之间会有一些延迟要从DB删除的项目和应用程序上更新的列表。 为避免此问题,您可以将本地列表与来自Stream列表分开管理。 在流更改时更新状态,但允许您从本地列表中本地删除项目并避免此类视图错误。

我最终对我的代码进行了一些更改来解决这个问题。

我在我的 bloc 中添加了一个 BehaviourSubject 来监控删除是否正在发生。 在 firestore delete 开始时,我将其设置为 true,然后将 .then 添加到 delete 以将其设置回 false。

然后我在屏幕上的 ListView 周围添加了一个 Streambuilder 来监视它的值并在为 true 时显示一个 CircularProgressIndicator。

现在看起来像这样:

在此处输入图片说明

谢谢你的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM