I try to understand a behavior between 2 stateful widgets.
I have a simple listeView and each Item is an ItemTest. I created in the ItemTestState a property that is initialized with the widget.item
in InitState().
With this code I got a "Dismissible widget is still part of the tree" when a try to remove an item, and I don't know why.
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',
),
),
);
}
}
Thanks for your help
The issue you’re facing is due to the way you’re handling the
key
in yourDismissible widget
.you’re initializing
item
withwidget.item
in theinitState()
method. This value is not updated when the widget rebuilds.