首页 > 其他分享 >AnimatedList 实现动态列表

AnimatedList 实现动态列表

时间:2024-01-14 18:55:42浏览次数:28  
标签:index 删除 AnimatedList list 列表 globalKey context 动态

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),
            );
          }),
    );
  }
}

 

 

 

 

标签:index,删除,AnimatedList,list,列表,globalKey,context,动态
From: https://www.cnblogs.com/xbinbin/p/17963879

相关文章

  • [刷题班] LeetCode1480. 一维数组的动态和
    题目描述思路:前缀和前缀和数组(prefixSum)的构造方法一:classSolution{publicint[]runningSum(int[]nums){int[]preSum=newint[nums.length];preSum[0]=nums[0];for(inti=1;i<nums.length;i++){preSum[i]......
  • 动态链接库的生成和使用
    1、当前目录/home/xuanmiao/Demo/LSPT/Test创建文件prime.h和prime.cprime.hintisprime(longintnumber);prime.cintisprime(longintnumber){longintj;intprime=1;/*Testifthenumberisdivisible,starting*from2*/for(j=2;......
  • python经典有序序列的list列表推导式
    生成一个数据列表#初始化一个列表list_1=[]#使用循环生成一个列表数据forvalinrange(0,20,1):#加入集合list_1.append(val)#打印列表数据print(list_1)#[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]使用列表推导式生......
  • 动态代理
    测试方法 publicclassTestAopProxy{publicstaticvoidmain(String[]args){ProxyFactoryproxyFactory=newProxyFactory(newCalculatorLogImpl());Calculatorproxy=(Calculator)proxyFactory.getProxy();proxy.add(15,5);......
  • 【C语言进阶篇】动态内存分配的六个常见错误
    <br>(文章目录)前言  <fontcolor=green>......
  • 筛选列表中的元素 与 删除元素中的字符串 的区别
    字符串分割为列表re.split(pat,string)pandas.Series([string]).astype(str).str.split(pat)先删除字符串首尾字符串,再分隔re.split(pat,string2.sptrip())先删除字符串中的字符串,再分隔re.split(pat,string.replace(string2,"")筛选列表中的元素[itemforiteminlisif......
  • 安卓仿微信朋友圈动态数据加载(包括评论和点赞,以及动态详情页)
    在项目里面使用到了类似微信朋友圈的功能,所以就研究了一下,大家先看看效果吧!效果图一:效果图二:效果图三:效果图四:效果图五:效果图六:效果图七:效果图八:......
  • 基于物联网的建筑物综合环境能耗监测管理系统是如何对建筑物的能耗进行动态监测的
    1能耗监测管理系统架构设计1.1管理平台系统架构设计建筑综合环境能耗监测管理主要是由感知层,网络层和应用层三层次结构组成。(1)感知层。建筑体内控制设备分散,需要在各个能耗设备终端加入能耗计量采集装置,根据现场情况,采集装置的通信技术可以采用现场总线技术,以太网传输或无线传输方......
  • 如何使用Python计算列表中所有数字的平均值
    在Python编程中,经常需要对列表中的数字进行各种数学运算。其中一个常见的任务是计算列表中所有数字的平均值。本文将向您介绍如何使用Python编程语言来实现这个任务。步骤:以下是计算列表中所有数字平均值的步骤:1.定义一个包含数字的列表。2.使用`sum()`函数计算列表中所有数字的总......
  • 如何使用Python从列表中删除指定的元素
    在Python编程中,我们经常需要从列表中删除指定的元素。这可以通过使用内置函数和方法来实现。本文将向您介绍如何使用Python语言中的删除函数和方法来删除列表中的元素。1.定义一个包含元素的列表。2.使用`remove()`函数删除列表中指定的元素。3.使用列表解析删除多个指定的元素。4.......