Flutter自动动画列表插件self_animated_list的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter自动动画列表插件self_animated_list的使用

AnimatedList能够在其数据列表发生变化时进行自动动画。

问题

当我们从API获取数据列表并更新磁贴时,通常会看到一些奇怪的事情发生——有些磁贴突然出现,有些则消失,而这些变化在一瞬间内完成。每当数据更新时,都会发生这样的情况。

我们可以使用Flutter SDK中的AnimatedList。但是,我们如何计算两个连续列表之间的差异,并知道哪些磁贴需要移除或添加到哪里?这是一个非平凡的任务,而且我们需要一些代码来控制磁贴的添加和移除。

解决方案

此小部件封装了差异逻辑,并包装了标准的AnimatedList。你所需要做的就是:

  1. 将你的数据列表传递给该小部件。
  2. 创建一个构建器,将数据映射到小部件。
  3. (可选)添加进出动画。

示例

以下是一个完整的示例,展示了如何使用self_animated_list插件。

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

import 'horizontal_tiles.dart';
import 'logic/list_cubit.dart';
import 'ui/controls/add_rem_value.dart';
import 'ui/controls/swap_value.dart';
import 'vertical_tiles.dart';

void main() => runApp(const MyApp());

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'SelfAnimatedList Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late final ListCubit _horizontalCubit = ListCubit();
  late final ListCubit _verticalCubit = ListCubit();

  int _toRemove = 1;
  int _toAdd = 1;
  int _toSwap = 0;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('SelfAnimatedList Demo'),
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          BlocProvider<ListCubit>(
            create: (BuildContext context) => _horizontalCubit,
            child: const HorizontalTiles(),
          ),
          const Divider(),
          Expanded(
            child: Row(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                BlocProvider<ListCubit>(
                  create: (BuildContext context) => _verticalCubit,
                  child: const VerticalTiles(),
                ),
                Expanded(
                  child: Center(
                    child: _controls(),
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  Widget _controls() {
    return SizedBox(
      width: 250,
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          AddRemValue(
            prefix: 'Add',
            readValue: () => _toAdd,
            onChange: (int value) => _toAdd = value,
          ),
          const SizedBox(height: 16),
          AddRemValue(
            prefix: 'Rem',
            readValue: () => _toRemove,
            onChange: (int value) => _toRemove = value,
          ),
          const SizedBox(height: 16),
          SwapValue(
            prefix: 'Swp',
            readValue: () => _toSwap,
            onChange: (int value) => _toSwap = value,
          ),
          const SizedBox(height: 16),
          ElevatedButton(
            onPressed: () {
              _horizontalCubit.update(
                toAdd: _toAdd,
                toRemove: _toRemove,
                toSwap: _toSwap,
              );

              _verticalCubit.update(
                toAdd: _toAdd,
                toRemove: _toRemove,
                toSwap: _toSwap,
              );
            },
            child: const Text('Update'),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何使用 self_animated_list 插件在 Flutter 中实现自动动画列表的示例代码。self_animated_list 是一个 Flutter 插件,它允许你创建具有平滑动画效果的列表项。

首先,确保你已经在 pubspec.yaml 文件中添加了 self_animated_list 依赖:

dependencies:
  flutter:
    sdk: flutter
  self_animated_list: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的示例代码,展示如何使用 SelfAnimatedList 来创建一个动画列表:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> items = List.generate(20, (index) => 'Item $index');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Self Animated List Demo'),
      ),
      body: SelfAnimatedList<String>(
        itemCount: items.length,
        itemBuilder: (context, index, animation) {
          return SlideTransition(
            position: Tween<Offset>(
              begin: Offset(1.0, 0.0),
              end: Offset(0.0, 0.0),
            ).animate(animation),
            child: FadeTransition(
              opacity: Tween<double>(begin: 0.0, end: 1.0).animate(animation),
              child: Padding(
                padding: const EdgeInsets.symmetric(vertical: 8.0),
                child: ListTile(
                  leading: Icon(Icons.label),
                  title: Text(items[index]),
                ),
              ),
            ),
          );
        },
        insertItem: (index, item) {
          setState(() {
            items.insert(index, item);
          });
        },
        removeItem: (index) {
          setState(() {
            items.removeAt(index);
          });
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            items.add('New Item');
          });
        },
        tooltip: 'Add Item',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释

  1. 依赖导入:首先导入 flutterself_animated_list 包。

  2. MyAppMyHomePage:这是标准的 Flutter 应用结构。MyApp 是应用的根组件,MyHomePage 是主页面。

  3. 数据列表:在 _MyHomePageState 类中,我们定义了一个包含 20 个字符串项的列表 items

  4. SelfAnimatedList

    • itemCount:列表项的数量。
    • itemBuilder:构建列表项的回调函数。每个列表项都会伴随一个动画对象 animation,你可以使用它来创建平滑的动画效果。在这个例子中,我们使用了 SlideTransitionFadeTransition 来创建滑动和淡入效果。
    • insertItemremoveItem:这两个回调函数用于在列表中插入和移除项。它们需要更新状态来触发 UI 的重新构建。
  5. 浮动操作按钮:点击按钮时,会在列表末尾添加一个新项。

运行效果

当你运行这个应用时,你会看到一个带有动画效果的列表。当你点击浮动操作按钮时,新的列表项会以平滑的动画效果添加到列表的末尾。

希望这个示例能够帮助你理解如何在 Flutter 中使用 self_animated_list 插件来实现自动动画列表。如果你有其他问题,欢迎继续提问!

回到顶部