簡體   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