AnimatedList Widget 与 ListView.builder 在存储可视化内容时的内存占用类似,即不会一次性将所有数据加载到内存中,而是按需加载。下面是一段示例代码,展示了 AnimatedList 如何使用 ListView.builder 进行动画效果:
class AnimatedListView extends StatefulWidget {
@override
_AnimatedListViewState createState() => _AnimatedListViewState();
}
class _AnimatedListViewState extends State {
final List _items = List.generate(10, (index) => index);
final GlobalKey _listKey = GlobalKey();
void _addItem() {
final int index = _items.length;
_items.add(index);
_listKey.currentState!.insertItem(index);
}
void _removeItem(int index) {
final int removedItem = _items.removeAt(index);
AnimatedListRemovedItemBuilder builder = (context, animation) {
return _buildItem(removedItem, animation);
};
_listKey.currentState!.removeItem(
index,
builder: builder,
duration: Duration(milliseconds: 500),
);
}
Widget _buildItem(int item, Animation animation) {
return SlideTransition(
position: Tween(
begin: const Offset(1, 0),
end: Offset.zero,
).animate(animation),
child: ListTile(
title: Text('Item $item'),
trailing: IconButton(
icon: Icon(Icons.delete_outline),
onPressed: () => _removeItem(item),
),
),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('AnimatedList Example'),
),
body: AnimatedList(
key: _listKey,
initialItemCount: _items.length,
itemBuilder: (context, index, animation) {
return _buildItem(_items[index], animation);
},
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: _addItem,
),
);
}
}
在这个示例中,我们创建了一个由 AnimatedList 组成的页面,其中每个项目都由一个 ListTile 组成。我们使用 ListView.builder 作为 AnimatedList 的构建器,并在 _addItem 和 _removeItem 方法中添加了元素和删除元素的逻辑。当我们添加或删除元素时,AnimatedList 会自动显示动画效果,并将适当的元素的高度调整到正确的值