flutter AnimatedList

AnimatedList 和 ListView 的功能大体相似,相比多了一个动效

//定义   GlobalKey必须指定类型
final _globalKey = GlobalKey<AnimatedListState>();

// 添加
onPressed: () {
    list.add("新数据");
    _globalKey.currentState!.insertItem(list.length - 1);
}, 

// 删除
_globalKey.currentState!.removeItem(index, (context, animation) {
      var removeItem = _buildItem(index);//先获取删除项的实例
	  list.removeAt(index);//将原集合数据也删除
      return FadeTransition(opacity: animation, child: removeItem, duration: const Duration(milliseconds: 500));  //根据实例进行删除
});

// 将_globalKey 传递给 AnimatedList
AnimatedList(
    key: _globalKey,
    initialItemCount: list.length, //列表长度
    itemBuilder: (BuildContext context, int index, animation) => FadeTransition(
        opacity: animation,    //动画效果
        child: ListTile( title: Text(list[index])),
    ),
),


//index 插入到哪个位置 [].length-1  代表最后一位
void insertItem(int index, { Duration duration = _kDuration });
void removeItem(int index, AnimatedListRemovedItemBuilder builder, { Durationduration = _kDuration }) ;
//运行代码
import 'dart:async';

import 'package:flutter/material.dart';

void main() {
  runApp(
    const MyAPP(),
  );
}

class MyAPP extends StatelessWidget {
  const MyAPP({super.key});
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(title: 'contaniner', home: HomePage());
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<String> list = ['1', '2', '3'];
  bool flag = true;
  final _globalKey = GlobalKey<AnimatedListState>();
  Widget _buildItem(index) => ListTile(
        title: Text(list[index]),
        trailing: IconButton(
            icon: const Icon(Icons.delete),
            onPressed: () => _deleteItem(index)),
      );
  _deleteItem(index) {
    //添加控制器 同时间内多次点击删除报错
    if (flag == true) {
      flag = false;
      _globalKey.currentState!.removeItem(index, (context, animation) {
        var removeItem = _buildItem(index); //先获取删除项的实例
        list.removeAt(index);//将原集合数据也删除,否则添加时 索引出错
        return FadeTransition(opacity: animation, child: removeItem); //根据实例进行删除
        // return FadeTransition(opacity: animation, child: _buildItem(index)); //根据实例进行删除
      }, duration: const Duration(milliseconds: 500));
      //解决快速删除问题
      Timer.periodic(const Duration(milliseconds: 500), (timer) {
        flag = true;
        timer.cancel();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Center(child: Text('PageViewSwiper1')),
      ),
      floatingActionButton: FloatingActionButton(
        // 浮动按钮
        onPressed: () {
          list.add('我是添加的');
          _globalKey.currentState!.insertItem(list.length - 1);
        }, //执行方法
        tooltip: 'Increment', // 提示
        child: const Icon(Icons.add), //按钮文案
      ),
      body: AnimatedList(
        key: _globalKey,
        initialItemCount: list.length, //列表长度
        itemBuilder: (BuildContext context, int index, animation) =>
            FadeTransition(
          opacity: animation,
          child: _buildItem(index),
        ),
      ),
    );
  }
}


 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值