我尝试理解两个有状态小部件之间的行为。我有一个简单的视图,每个项目都是一个ItemTest。我在ItemTestState中创建了一个属性,该属性在InitState()中使用widget.item
初始化。使用此代码,当尝试删除一个项目时,我得到了“Dismissible widget is still part of the tree”,我不知道为什么。
class DismissibleExample extends StatefulWidget {
const DismissibleExample({super.key});
@override
State<DismissibleExample> createState() => _DismissibleExampleState();
}
class _DismissibleExampleState extends State<DismissibleExample> {
List<int> items = List<int>.generate(100, (int index) => index);
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
padding: const EdgeInsets.symmetric(vertical: 16),
itemBuilder: (BuildContext context, int index) {
return ItemTest(
item: items[index],
onDismissed: () {
setState(() {
items.removeAt(index);
});
},
);
},
);
}
}
class ItemTest extends StatefulWidget {
const ItemTest({
super.key,
required this.item,
required this.onDismissed,
});
final int item;
final Function() onDismissed;
@override
State<ItemTest> createState() => _ItemTestState();
}
class _ItemTestState extends State<ItemTest> {
int item = 0;
@override
void initState() {
item = widget.item;
super.initState();
}
@override
Widget build(BuildContext context) {
return Dismissible(
background: Container(
color: Colors.green,
),
key: ValueKey<int>(item),
onDismissed: (direction) {
widget.onDismissed();
},
child: ListTile(
title: Text(
'Item $item',
),
),
);
}
}
字符串
的数据
谢谢你的帮助
1条答案
按热度按时间kmpatx3s1#
您面临的问题是由于您在
Dismissible widget
中处理key
的方式造成的。你在
initState()
方法中使用widget.item
初始化item
。当小部件重新生成时,此值不会更新。字符串