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常见属性:

关于GlobalKey: 每个 Widget 都对应一个 Element ,我们可以直接对 Widget 进行操作,但是无法直
接操作 Widget 对应的 Element 。而 GlobalKey 就是那把直接访问 Element 的钥匙。通过 GlobalKey
可以获取到 Widget 对应的 Element 。

AnimatedList增加列表FadeTransition、ScaleTransition

FadeTransition Demo
class HomePage extends StatefulWidget {
const HomePage({super.key}); @override
State<HomePage> createState() => _HomePageState();
} class _HomePageState extends State<HomePage> {
final globalKey = GlobalKey<AnimatedListState>();
List<String> list = ["第一条数据", "第二条数据"]; @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Title'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
list.add("这是一个新增数据");
globalKey.currentState!.insertItem(list.length - 1); //索引值为n-1
});
},
child: Icon(Icons.abc),
),
body: AnimatedList(
key: globalKey,
initialItemCount: list.length,
itemBuilder: (context, index, animation) {
return FadeTransition(
opacity: animation,
child: ListTile(
title: Text(list[index]), trailing: Icon(Icons.delete)),
);
}),
);
}
}
ScaleTransition demo
class HomePage extends StatefulWidget {
const HomePage({super.key}); @override
State<HomePage> createState() => _HomePageState();
} class _HomePageState extends State<HomePage> {
final globalKey = GlobalKey<AnimatedListState>();
List<String> list = ["第一条数据", "第二条数据"]; @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Title'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
list.add("这是一个新增数据");
globalKey.currentState!.insertItem(list.length - 1); //索引值为n-1
});
},
child: Icon(Icons.abc),
),
body: AnimatedList(
key: globalKey,
initialItemCount: list.length,
itemBuilder: (context, index, animation) {
return ScaleTransition(
scale: animation,
child: ListTile(
title: Text(list[index]), trailing: Icon(Icons.delete)),
);
}),
);
}
}

AnimatedList 删除列表

class HomePage extends StatefulWidget {
const HomePage({super.key}); @override
State<HomePage> createState() => _HomePageState();
} class _HomePageState extends State<HomePage> {
final globalKey = GlobalKey<AnimatedListState>();
bool flag = true;
List<String> list = ["第一条数据", "第二条数据"]; //删除
Widget _buildItem(context, index) {
return ListTile(
key: ValueKey(index),
title: Text(list[index]), //显示的数据
trailing: IconButton(
icon: Icon(Icons.delete), //删除的图标
// 点击时删除
onPressed: () => _deleteItem(context, index),
));
} _deleteItem(context, index) {
if (flag == true) {
flag = false;
print(index);
//注意:删除后需要重新setState
setState(() {
// 删除过程执行的是反向动画,animation.value 会从1变为0
globalKey.currentState!.removeItem(
index,
(context, animation) {
//执行删除
//注意先build然后再去删除
var item = _buildItem(context, index);
list.removeAt(index); //数组中删除数据
return FadeTransition(
//动画
opacity: animation,
child: item, //执行动画的元素
);
},
);
});
//解决快速删除bug 重置flag
const timeout = Duration(milliseconds: 2000); //每2秒才删除一个
Timer.periodic(timeout, (timer) {
flag = true;
timer.cancel();
});
}
} @override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Title'),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
list.add("这是一个新增数据");
globalKey.currentState!.insertItem(list.length - 1); //索引值为n-1
});
},
child: const Icon(Icons.abc),
),
body: AnimatedList(
key: globalKey,
initialItemCount: list.length,
itemBuilder: (context, index, animation) {
return ScaleTransition(
scale: animation,
child: _buildItem(context, index),
);
}),
);
}
}
 

AnimatedList 实现动态列表的更多相关文章

  1. T-SQL Recipes之生成动态列表数据

    Problem 首先什么是动态列表?举个示例,假设你想输出以逗号分隔的IDs,如: 1,45,67,199,298 Solution 生成动态列表数据在我们生活场景中很常见,比如在 Dynamic P ...

  2. ajax获取动态列表数据后的分页问题

    ajax获取动态列表数据后的分页问题 这是我在写前台网站时遇到的一个分页问题,由于数据是通过ajax的方式来请求得到的,如果引入相应的js文件来做分页,假如只是静态的填放数据到列表各项内容中(列表条数 ...

  3. 【柠檬班】jmeter 不写代码,秒秒钟提取动态列表最后一个值

    在用jmeter做接口测试时,我们经常会遇到,一个接口返回一个json串,在这个json串中,某个节点的值是一个列表,而且这个列表的长度是动态变化的.如:   获取用户列表,用户信息是个列表,类似的接 ...

  4. JMeter接口测试-提取动态列表最后一个值的两种方法

    前言 在用JMeter做接口测试时,我们经常会遇到,一个接口返回一个json串,在这个json串中,某个节点的值是一个列表,而且这个列表的长度是动态变化的.今天我们来学习两种提取动态列表最后一个值的两 ...

  5. VUE Angular通用动态列表组件-亦可为自动轮播组件-01-根据数据量自动纵向滚动,鼠标划入停止滚动

    本文为纵向轮播,横向轮播/动态列表组件请戳---- 代码是angular的,稍微改改就可以放入Vue项目里,差别不大哟 以下代码可以根据实际情况自行调整 父组件html <app-scroll- ...

  6. VUE Angular通用动态列表组件-亦可为自动轮播组件-02-根据数据量自动横向滚动,鼠标划入停止滚动

    本文为横向轮播,纵向轮播/动态列表组件请戳---- 代码是angular的,稍微改改就可以放入Vue项目里,差别不大哟 以下代码可以根据实际情况自行调整 父组件html <app-scroll- ...

  7. flutter动态列表

    在前面一篇总结flutter里面的列表组件ListView的时候,一直都是使用的静态数据,但是在实际的运用过程中,数据都是从后台获取的动态数据,不能再像前面那样写静态数据了,下面模拟一下如果使用动态数 ...

  8. MUI - 解决动态列表页图片懒加载再次加载不成功的bug

    首先描述一下功能 实现列表页动态加载 通过官方提供的"下拉刷新和上拉刷新"及"图片懒加载"示例实现. http://www.cnblogs.com/philly ...

  9. 08ListView动态列表组件 以及循环动态数据

    效果: main.dart import 'package:flutter/material.dart'; import 'res/listData.dart'; /* ListView:参数 scr ...

  10. 通过freemarker生成一个word,解决生成的word用wps打开有问题的问题,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

     通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名 ...

随机推荐

  1. Capture Data.dmg

    苹果apple mac 系统检测  日常分析  软件 https://gigafiles.apple.com/#/download 现有文件可供下载. 备注 Capture Data 9.9.0 Th ...

  2. 放弃老旧的Mybatis,强类型替换字符串,这是一款你不应该错过的ORM

    一款轻量级.高性能.强类型.易扩展符合C#开发者的JAVA自研ORM github地址 easy-query https://github.com/xuejmnet/easy-query gitee地 ...

  3. 再见,Spring!你好,Solon!

    Solon 是什么框架? Java 生态级应用开发框架.从零开始构建,有自己的标准规范与开放生态(历时五年,具备全球第二级别的生态规模).与其他框架相比,解决了两个重要的痛点:启动慢,费内存. 解决痛 ...

  4. DP优化方法杂记

    一些奇妙trick 观察决策集合 此类问题与单调队列优化dp有部分相似,都是利用决策集合的特殊性质对dp进行优化. CF229D Towers 题意:给出一个序列,每次可以花费一体力合并相邻两个数,问 ...

  5. 小白也能看懂的 AUC 曲线详解

    小白也能看懂的 AUC 曲线详解 简介 上篇文章 小白也能看懂的 ROC 曲线详解 介绍了 ROC 曲线.本文介绍 AUC.AUC 的全名为Area Under the ROC Curve,即 ROC ...

  6. Flyweight 享元模式简介与 C# 示例【结构型6】【设计模式来了_11】

    〇.简介 1.什么是享元模式? 一句话解释:   将相似或同类的对象共享同一个对象,将这些对象暂存在列表中,使用时直接取出,避免每次使用时都要新建浪费资源. 享元模式的目的是减少对象的创建,通过共享对 ...

  7. langchain中的chat models介绍和使用

    简介 之前我们介绍了LLM模式,这种模式是就是文本输入,然后文本输出. chat models是基于LLM模式的更加高级的模式.他的输入和输出是格式化的chat messages. 一起来看看如何在l ...

  8. 【MySQL】MySQL中的锁

    全局锁 全局锁是对整个数据库实例加锁,整个库处于只读状态. flush tables with read lock 适用场景 全局锁适用于做全库逻辑备份,但是整个库处于只读状态,在备份期间,所有的更新 ...

  9. HTTP响应状态码([RFC9110])

    本内容翻译自[RFC9110]15. Status Codes,不足之处请自行查阅文档. 15. 状态码 响应的状态码是一个三位整数代码,用于描述请求的结果和响应的语义,包括请求是否成功以及附带了什么 ...

  10. JavaScript高级程序设计笔记04 变量、作用域与内存

    变量.作用域与内存 变量 特定时间点一个特定值的名称. 分类 原始值:按值访问 复制:两个独立使用.互不干扰 引用值(由多个值构成的对象):按引用访问 操作对象时,实际上操作的是对该对象的引用(ref ...