下面有一个完整的示例,说明如何尝试实现带有可禁用项目的AnimatedList,您可以向左滑动以将其删除:
final GlobalKey<AnimatedListState> _listKey = GlobalKey();
final _items = ['0','1','2','3','4','5','6','7','8','9','10'];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('list test'),),body: Center(
child: AnimatedList(
key: _listKey,initialItemCount: _items.length,itemBuilder: (context,index,animation) =>
_buildItem(index,context,animation),);
}
Widget _buildItem(int index,BuildContext context,Animation animation,[passedDismissible]) {
var dismissible;
dismissible = passedDismissible ??
Dismissible(
key: Key(_items[index].toString()),background: Container(
color: Colors.redaccent,direction: DismissDirection.endToStart,child: Center(
child: Text('item ' + _items[index]),confirmDismiss: (_) {
return Future.delayed(Duration(seconds: 2),() {
return true;
});
},onDismissed: (_) {
_listKey.currentState.removeItem(
index,(context,animation) {
return _buildItem(index,animation,dismissible);
},duration: Duration(milliseconds: 500),);
_items.removeAt(index);
},);
return SizeTransition(
sizeFactor: animation,axis: Axis.vertical,child: SizedBox(
height: 100,child: dismissible,);
}
此示例将在2秒内确认删除。
为了在播放删除动画时保持红色背景,我自己进行了_buildItem调用,并传递了Dismissible小部件。如果您知道更好的解决方案,请告诉我。
现在真正的问题是,如果您从上到下快速滑动一些项目,您会发现红色消失了,有时甚至会引起异常。但是,如果您从下往上滑动,一切正常。
我还注意到,如果您已将某物品滑走,则可以在红色上滑动,然后突然出现这些物品。这样做也是导致异常的秘诀……我设法阻止了用户交互,以防止这种情况发生(在本示例中不是)。
我一直在玩这个游戏,我想知道怎样正确地使它们按应有的方式工作。
谢谢!