Flutter平滑动画列表插件smooth_animated_listview的使用

Flutter平滑动画列表插件smooth_animated_listview的使用

smooth_animated_list

一个为项目提供平滑过渡效果的动画列表插件。

特性

  • 自动动画处理项的添加和移除
  • 平滑的淡入淡出和大小变化过渡
  • 支持自定义相等性检查
  • 类型安全实现
  • 简单的API

开始使用

pubspec.yaml文件中添加依赖:

dependencies:
  smooth_animated_list: ^1.0.0

使用示例

基本用法

这是一个简单的例子:

SmoothAnimatedList<String>(
  items: ['Item 1', 'Item 2', 'Item 3'],
  itemBuilder: (context, item, animation) {
    return SlideTransition(
      position: Tween<Offset>(
        begin: const Offset(1, 0),
        end: Offset.zero,
      ).animate(animation),
      child: Card(
        child: ListTile(
          title: Text(item),
        ),
      ),
    );
  },
);

自定义对象相等性检查

对于具有自定义相等性的对象:

class Item {
  final String id;
  final String title;

  Item(this.id, this.title);
}
SmoothAnimatedList<Item>(
  items: [
    Item('1', 'Item 1'),
    Item('2', 'Item 2'),
    Item('3', 'Item 3'),
  ],
  itemBuilder: (context, item, animation) {
    return SlideTransition(
      position: Tween<Offset>(
        begin: const Offset(1, 0),
        end: Offset.zero,
      ).animate(animation),
      child: Card(
        child: ListTile(
          title: Text(item.title),
        ),
      ),
    );
  },
  areItemsTheSame: (oldItem, newItem) => oldItem.id == newItem.id,
);

额外参数

  • duration: 动画持续时间(默认:300ms)
  • areItemsTheSame: 自定义相等性检查函数

许可证

MIT许可证 - 详情请参阅LICENSE文件


### 完整示例代码

以下是完整的示例代码:

```dart
import 'package:flutter/material.dart';
import 'package:smooth_animated_listview/smooth_animated_listview.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const ListExample(),
    );
  }
}

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

  [@override](/user/override)
  State<ListExample> createState() => _ListExampleState();
}

class _ListExampleState extends State<ListExample> {
  List<String> data = ["0", "1", "2", "3", "5"];

  bool show = true;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          IconButton(
            onPressed: () {
              setState(() {
                show = !show;
              });
            },
            icon: const Icon(Icons.hide_source),
          ),
          IconButton(
            onPressed: () {
              setState(() {
                data = List.generate(13, (int index) => "$index");
              });
            },
            icon: const Icon(Icons.refresh),
          )
        ],
      ),
      body: show
          ? SmoothAnimatedList<String>(
              key: Key("data.length.toString()"),
              items: data,
              itemBuilder: (context, item, animation) {
                return SizeTransition(
                  sizeFactor: animation,
                  child: ListTile(
                    onTap: () {
                      data.remove(item);
                      setState(() {});
                    },
                    title: Text(item),
                  ),
                );
              },
            )
          : const CircularProgressIndicator(),
    );
  }
}

更多关于Flutter平滑动画列表插件smooth_animated_listview的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter平滑动画列表插件smooth_animated_listview的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


smooth_animated_listview 是一个 Flutter 插件,用于创建平滑动画的列表视图。它可以让你在列表项插入、删除或重新排序时,自动应用平滑的动画效果。这个插件非常适合需要动态更新列表内容的场景,例如聊天应用、待办事项列表等。

安装

首先,你需要在 pubspec.yaml 文件中添加 smooth_animated_listview 依赖:

dependencies:
  flutter:
    sdk: flutter
  smooth_animated_listview: ^0.0.1 # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

下面是一个简单的示例,展示了如何使用 smooth_animated_listview 来创建一个带有平滑动画的列表视图。

import 'package:flutter/material.dart';
import 'package:smooth_animated_listview/smooth_animated_listview.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Smooth Animated ListView Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AnimatedListViewDemo(),
    );
  }
}

class AnimatedListViewDemo extends StatefulWidget {
  @override
  _AnimatedListViewDemoState createState() => _AnimatedListViewDemoState();
}

class _AnimatedListViewDemoState extends State<AnimatedListViewDemo> {
  List<String> items = ['Item 1', 'Item 2', 'Item 3'];

  void _addItem() {
    setState(() {
      items.add('Item ${items.length + 1}');
    });
  }

  void _removeItem(int index) {
    setState(() {
      items.removeAt(index);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Smooth Animated ListView'),
      ),
      body: SmoothAnimatedListView(
        itemCount: items.length,
        itemBuilder: (context, index, animation) {
          return SizeTransition(
            sizeFactor: animation,
            child: Card(
              margin: EdgeInsets.all(8.0),
              child: ListTile(
                title: Text(items[index]),
                trailing: IconButton(
                  icon: Icon(Icons.delete),
                  onPressed: () => _removeItem(index),
                ),
              ),
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _addItem,
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释

  1. SmoothAnimatedListView:

    • itemCount: 列表项的数量。
    • itemBuilder: 用于构建每个列表项的构建器。它接收 BuildContextindexanimation 参数。animation 是一个 Animation<double> 对象,可以用于控制列表项的动画效果。
  2. SizeTransition:

    • sizeFactor: 使用 animation 来控制列表项的大小变化,从而实现平滑的插入和删除动画。
  3. 添加和删除列表项:

    • _addItem 方法用于向列表中添加新项。
    • _removeItem 方法用于从列表中删除指定索引的项。

自定义动画

你可以根据需要自定义动画效果。例如,可以使用 FadeTransition 来实现淡入淡出效果,或者使用 SlideTransition 来实现滑动效果。

itemBuilder: (context, index, animation) {
  return FadeTransition(
    opacity: animation,
    child: SizeTransition(
      sizeFactor: animation,
      child: Card(
        margin: EdgeInsets.all(8.0),
        child: ListTile(
          title: Text(items[index]),
          trailing: IconButton(
            icon: Icon(Icons.delete),
            onPressed: () => _removeItem(index),
          ),
        ),
      ),
    ),
  );
},
回到顶部