Flutter动画流列表插件animated_stream_list_nullsafety的使用

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

Flutter动画流列表插件animated_stream_list_nullsafety的使用

pub package

animated_stream_list_nullsafety 是一个Flutter库,可以轻松地从 Stream<List<E>> 显示带有动画变化的列表。它类似于 StreamBuilder + ListView.Builder,但带有动画效果。该插件受到了 Animated List SampleJava-diff-utils 的启发。

Demo

开始使用

1. 在 pubspec.yaml 中添加依赖

dependencies:
  animated_stream_list_nullsafety: ^2.0.0

2. 导入库

import 'package:animated_stream_list_nullsafety/animated_stream_list.dart';

3. 使用插件

请参阅 examples 文件夹中的示例。

参数

  • @required Stream<List<E>> streamList: 数据流,包含列表项。
  • @required AnimatedStreamListItemBuilder<E> itemBuilder: 构建列表项的函数。
  • @required AnimatedStreamListItemBuilder<E> itemRemovedBuilder: 构建移除列表项的函数。
  • Duration duration: 动画持续时间。

AnimatedStreamListItemBuilder<T> 是一个构建列表项的函数:

typedef Widget AnimatedStreamListItemBuilder<T>(
  T item,
  int index,
  BuildContext context,
  Animation<double> animation,
);

示例

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

示例代码

import 'package:flutter/material.dart';
import 'package:animated_stream_list_nullsafety/animated_stream_list.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Animated Stream List example',
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final StreamController<List<String>> _streamController = StreamController<List<String>>();

  @override
  void initState() {
    super.initState();
    _initializeData();
  }

  void _initializeData() {
    Future.delayed(Duration(seconds: 1), () {
      _streamController.add(['Item 1', 'Item 2', 'Item 3']);
    });

    Future.delayed(Duration(seconds: 3), () {
      _streamController.add(['Item 1', 'Item 2', 'Item 3', 'Item 4']);
    });

    Future.delayed(Duration(seconds: 5), () {
      _streamController.add(['Item 1', 'Item 3', 'Item 4']);
    });
  }

  @override
  void dispose() {
    _streamController.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Stream List Example'),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: AnimatedStreamList<String>(
          streamList: _streamController.stream,
          itemBuilder: (item, index, context, animation) {
            return _createTile(item, animation);
          },
          itemRemovedBuilder: (item, index, context, animation) {
            return _createRemovedTile(item, animation);
          },
          duration: Duration(milliseconds: 300),
        ),
      ),
    );
  }

  Widget _createTile(String item, Animation<double> animation) {
    return SizeTransition(
      axis: Axis.vertical,
      sizeFactor: animation,
      child: ListTile(
        title: Text(item),
      ),
    );
  }

  Widget _createRemovedTile(String item, Animation<double> animation) {
    return SizeTransition(
      axis: Axis.vertical,
      sizeFactor: animation,
      child: ListTile(
        title: Text(item, style: TextStyle(color: Colors.red)),
      ),
    );
  }
}

选项

  • List<E> initialList: 初始列表。
  • Equalizer equals: 比较项目是否相等的函数,默认使用 == 运算符。确保这个函数工作正常非常重要。
typedef bool Equalizer(dynamic item1, dynamic item2);

其他选项与 AnimatedList 类似,包括:

  • Axis scrollDirection
  • bool reverse
  • ScrollController scrollController
  • bool primary
  • ScrollPhysics scrollPhysics
  • bool shrinkWrap
  • EdgeInsetsGeometry padding

您可以查看 Animated List 文档 了解更多详细信息。

致谢

这个出色的包最初由 Dawid Bota 创建,可以在 这里 找到。我已获得他的许可并接管了开发,所有跟踪将在本仓库中进行。


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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用animated_stream_list_nullsafety插件的示例代码。这个插件允许你创建一个带有动画效果的流列表,非常适合用于实时数据更新的场景,比如聊天应用或实时数据监控。

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

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

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

接下来,是一个完整的示例代码,展示如何使用AnimatedStreamList来创建一个动画流列表:

import 'package:flutter/material.dart';
import 'package:animated_stream_list_nullsafety/animated_stream_list.dart';
import 'dart:async';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  final StreamController<String> _controller = StreamController<String>();
  Timer? _timer;

  @override
  void initState() {
    super.initState();
    _startAddingItems();
  }

  @override
  void dispose() {
    _controller.close();
    _timer?.cancel();
    super.dispose();
  }

  void _startAddingItems() {
    int count = 0;
    _timer = Timer.periodic(Duration(seconds: 1), (Timer t) {
      count++;
      _controller.add('Item $count');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Stream List Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: AnimatedStreamList<String>(
          stream: _controller.stream,
          itemBuilder: (context, item, index, animation) {
            return SlideTransition(
              position: Tween<Offset>(
                begin: Offset.zero,
                end: const Offset(1.0, 0.0),
              ).animate(animation),
              child: Card(
                child: Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: Text(item),
                ),
              ),
            );
          },
          separatorBuilder: (_, index) => Divider(),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // Example of adding an item manually (not via the stream in this case)
          // Note: This is just to show how you might manually trigger an update,
          // but in this demo, items are added automatically via the _timer.
          // _controller.add('Manual Item');
        },
        tooltip: 'Add Item',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释:

  1. 依赖添加:在pubspec.yaml中添加animated_stream_list_nullsafety依赖。

  2. 主应用MyApp是一个简单的Flutter应用,它包含了一个MaterialApp和一个MyHomePage

  3. 首页MyHomePage是一个有状态组件,它包含一个StreamController<String>用于控制数据流。

  4. 数据添加:在initState方法中,启动一个每秒添加一个新条目的定时器。

  5. 资源释放:在dispose方法中,关闭StreamController并取消定时器。

  6. 动画流列表:使用AnimatedStreamList来创建动画效果的流列表。itemBuilder定义了每个条目的动画和UI,这里使用了SlideTransition来实现条目从右侧滑入的动画效果。

  7. 分隔符separatorBuilder用于添加条目之间的分隔符。

  8. 浮动按钮:虽然在这个示例中没有实际使用,但提供了一个浮动按钮的示例位置,你可以通过取消注释相关代码来手动添加条目。

这个示例展示了如何使用animated_stream_list_nullsafety插件来创建一个带有动画效果的实时更新列表。根据具体需求,你可以调整动画效果、数据模型以及UI设计。

回到顶部