如何解决“一个被关闭的,可关闭的小部件仍然是树的一部分。”颤振误差

时间:2019-04-22 09:54:56

标签: flutter

我正在使用可弃用的小部件,firebase和StreamBuilder构建一个繁琐的应用程序,并收到以下错误消息:“被弃用的可弃置小部件仍是树的一部分。”

请找到以下相同的代码。

Expanded(
                  child: StreamBuilder(
                    stream: Firestore.instance
                        .document('/users/User1/Trips/${widget.tripId}')
                        .collection('TropDocs')
                        .snapshots(),
                    builder: (context, snapshot) {
                      if (!snapshot.hasData) return const Text("Loading....");
                      return ListView.builder(
                        itemExtent: 150.0,
                        itemCount: snapshot.data.documents.length,
                        itemBuilder: (context, index) {

final item = snapshot.data.documents[index];
                          final itemID =
                              snapshot.data.documents[index].documentID;
                          final list = snapshot.data.documents;      
return Dismissible(
   key: Key(itemID),
              // We also need to provide a function that tells our app
              // what to do after an item has been swiped away.
              onDismissed: (direction) {
                // Remove the item from our data source.

                //fBtDoc.deleteTraveldoc(item);
                //Firestore.instance.collection('/users/User1/Trips/${widget.tripId}/TropDocs/').document('$itemID').delete();
                setState(() {
                  list.removeAt(index);
                });

                // Then show a snackbar!
                Scaffold.of(context)
                    .showSnackBar(SnackBar(content: Text("$item dismissed")));
              },
              // Show a red background as the item is swiped away
              background: Container(color: Colors.red),
              child: _buildlistitem(
                            context, snapshot.data.documents[index])
);

                        }
                      );
                    },
                  ),
                )

7 个答案:

答案 0 :(得分:10)

可能是我迟到了,但我认为这对其他人有帮助。有同样的问题,甚至设置

key: Key(itemId[index]),

没用。然而,

key: UniqueKey(),

非常适合我

答案 1 :(得分:2)

原因是传递给 key 属性的值不是唯一的或与列表的索引相关。 解决方案非常简单,您需要做的就是将 key 属性设置为 UniqueKey(),如下所示:

键:UniqueKey(),

答案 2 :(得分:0)

我认为这是因为您尝试对每个可解雇者使用相同的key

key: Key(itemID)

应为key: Key(itemID[index])

答案 3 :(得分:0)

删除setState块,streamBuilder将自行重建列表

 setState(() {
   list.removeAt(index);
 });

答案 4 :(得分:0)

我会做这样的事情以消除从右向左滑动

                        confirmDismiss: (direction) {
                      return Future.value(direction == DismissDirection.endToStart);
                    },
                    onDismissed: (direction) {
                      setState(() {
                        list.removeAt(index);
                      });
                    },

答案 5 :(得分:0)

单个小部件可关闭的解决方法如下所示,以及根据提供的代码在列表写入逻辑中关闭的解决方法。在这里,我们为 Dismissible 设置了一个 if 条件,并在 onDismissed 中将该 bool 变量设置为 false,以便它不会保留在小部件树中。

if (_boolVariable)
 Dismissible(
    key: Key('anyString'),
    onDismissed: (direction) {
      //your code here
      setState(() => _boolVariable = false);
    },
  child: YourWidget())

答案 6 :(得分:0)

在我的事业中,我使用了如下

key: Key(index),

然后我确实改变了它如下。它正在工作

key: UniqueKey(),