AnimatedList实现动画
AnimatedList 和 ListView 的功能大体相似,不同的是, AnimatedList 可以在列表中插入或删除节点 时执行一个动画,在需要添加或删除列表项的场景中会提高用户体验。
AnimatedList 是一个 StatefulWidget,它对应的 State 类型为 AnimatedListState,添加和删除元素的 方法位于 AnimatedListState 中:
void insertItem(int index, { Duration duration = _kDuration });
void removeItem(int index, AnimatedListRemovedItemBuilder builder, { Duration
duration = _kDuration }) ;
AnimatedList常见属性:
| 属性 | 描述 |
|---|---|
| key | globalKey final globalKey = GlobalKey(); |
| initialItemCount | 列表项的初始数量 |
| itemBuilder | 方法 ( BuildContext context, int index, Animation animation) {} |
关于GlobalKey: 每个Widget 都对应一个Element ,我们可以直接对Widget 进行操作,但是无法直 接操作Widget 对应的Element 。而GlobalKey 就是那把直接访问Element 的钥匙。通过GlobalKey 可以获取到Widget 对应的Element 。
AnimatedList增加列表FadeTransition、ScaleTransition
这里面新增用的是FadeTransition 删除用的是ScaleTransition,两种动画效果不一样,可以根据自己的需求选择
import 'dart:async';
import 'package:flutter/material.dart';
import 'tools/pageViewKeepAlive.dart';
class SearchPage extends StatefulWidget {
const SearchPage({super.key});
@override
State<SearchPage> createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
bool _flag = true;
final _globalKey = GlobalKey<AnimatedListState>();
List<String> list = ['第一条', '第二条', '第三条', '第四条', '第五条'];
Widget _buildItem(index){
return ListTile(
title: Text(list[index]),
trailing: IconButton(
icon: const Icon(Icons.delete),
onPressed: () {
_deleteItem(index);
},
)
);
}
_deleteItem(index){
if(_flag == true){
_flag = false;
print('删除第$index条');
_globalKey.currentState!.removeItem(index, (context, animation) {
var removeItem = _buildItem(index);
list.removeAt(index);
return ScaleTransition(
//opacity: animation,
scale: animation,
child: removeItem,
);
});
Timer.periodic(const Duration(milliseconds: 500), (timer) {
_flag = true;
timer.cancel();
});
}
}
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('搜索'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// setState(() {
// });
list.add('第六条');
_globalKey.currentState!.insertItem(list.length - 1);
},
child: const Icon(Icons.add),
),
body: AnimatedList(
key: _globalKey,
initialItemCount: list.length,
itemBuilder: (context, index, animation) {
return FadeTransition(
opacity: animation,
child: _buildItem(index),
);
},
),
);
}
}