我正在使用可弃用的小部件,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])
);
}
);
},
),
)
答案 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(),