Flutter高效列表管理插件clever_list的使用

Flutter高效列表管理插件clever_list的使用

Clever List

CleverList 是一个 ListView 小部件,它隐式地对更改进行动画处理。CleverLists 是由数据对象列表构建的。

使用

使用 CleverList 非常直接。你需要创建一个项目列表,定义一个构建器函数来渲染每个项目,并指定可选的插入和删除动画。

首先,你需要为你的列表准备一些数据。列表使用 == 运算符进行比较。你也可以通过使用 equalityChecker 来设置自己的比较方法。

// 你想要用来构建列表的数据。
var persons = <String>[
  'Rick',
  'Beth',
  'Jerry'
];

然后你可以使用这些数据来构建你的小部件:

CleverList<String>(
  items: persons,
  builder: (context, value) {
    return ListTile(
      title: Text(value),
    );
  },
)

现在,当 persons 发生变化并且状态更新时,列表将自动对更改进行动画处理。

自定义

你可以使用 insertDurationremoveDuration 来自定义插入和删除的持续时间。

你还可以使用 insertTransitionBuilderremoveTransitionBuilder 参数来自定义插入和删除的动画效果。

对于更高级的用例,你可以扩展 CleverListBaseCleverListWidget 来实现自己的功能。

致谢

该包受 diffutil_sliverlist 的启发。

示例代码

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

import 'dart:math';

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

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

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

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

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

  [@override](/user/override)
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  // 数据对象用于构建列表。
  var persons = <Person>[
    Person(name: 'Bert', age: 64),
    Person(name: 'Martin', age: 43),
    Person(name: 'John', age: 29),
    Person(name: 'Albert', age: 25),
    Person(name: 'Mike', age: 15),
    Person(name: 'Mohammed', age: 54),
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('CleverList'),
        actions: [
          IconButton(
            onPressed: () {
              // 向列表中添加一个项目。
              setState(() {
                final list = List<Person>.from(persons);
                list.add(Person(name: 'peter', age: Random().nextInt(200)));
                persons = list;
              });
            },
            icon: const Icon(Icons.add),
          ),
        ],
      ),
      body: CleverList<Person>(
        items: persons,
        builder: (context, value) {
          return ListTile(
            title: Text(
              value.name,
            ),
            onTap: () {
              setState(() {
                final list = List<Person>.from(persons);

                list.remove(value);
                persons = list;
              });
            },
          );
        },
      ),
    );
  }
}

class Person {
  final String name;
  final int age;

  Person({required this.name, required this.age});

  [@override](/user/override)
  bool operator ==(covariant Person other) {
    if (identical(this, other)) return true;

    return other.name == name && other.age == age;
  }

  [@override](/user/override)
  int get hashCode => name.hashCode ^ age.hashCode;

  [@override](/user/override)
  String toString() => 'Person(name: $name, age: $age)';
}

更多关于Flutter高效列表管理插件clever_list的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高效列表管理插件clever_list的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


clever_list 是一个用于 Flutter 的高效列表管理插件,旨在优化长列表的性能,并简化列表的管理和操作。它特别适用于需要处理大量数据的场景,如聊天列表、新闻列表等。以下是如何使用 clever_list 的基本指南。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 clever_list 依赖:

dependencies:
  flutter:
    sdk: flutter
  clever_list: ^1.0.0  # 请使用最新版本

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

2. 基本使用

创建一个简单的列表

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

class MyList extends StatelessWidget {
  final List<String> items = List.generate(100, (index) => 'Item $index');

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Clever List Example'),
      ),
      body: CleverList(
        itemCount: items.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(items[index]),
          );
        },
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: MyList(),
));

懒加载更多数据

clever_list 支持懒加载功能,可以在用户滚动到底部时加载更多数据。

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

class MyLazyLoadList extends StatefulWidget {
  @override
  _MyLazyLoadListState createState() => _MyLazyLoadListState();
}

class _MyLazyLoadListState extends State<MyLazyLoadList> {
  List<String> items = List.generate(20, (index) => 'Item $index');
  bool isLoading = false;

  void _loadMore() async {
    if (isLoading) return;

    setState(() {
      isLoading = true;
    });

    // 模拟网络请求
    await Future.delayed(Duration(seconds: 2));

    setState(() {
      items.addAll(List.generate(20, (index) => 'Item ${items.length + index}'));
      isLoading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Lazy Load List'),
      ),
      body: CleverList(
        itemCount: items.length + 1,
        itemBuilder: (context, index) {
          if (index == items.length) {
            return Center(
              child: isLoading ? CircularProgressIndicator() : ElevatedButton(
                onPressed: _loadMore,
                child: Text('Load More'),
              ),
            );
          }
          return ListTile(
            title: Text(items[index]),
          );
        },
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: MyLazyLoadList(),
));

3. 高级功能

自定义列表项高度

clever_list 支持自定义列表项高度,以进一步优化性能。

CleverList(
  itemCount: items.length,
  itemHeight: 56.0,  // 设置固定高度
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index]),
    );
  },
)

使用 ListView 的替代品

clever_listListView 的替代品,但它提供了更多的性能优化选项。

CleverList.builder(
  itemCount: items.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(items[index]),
    );
  },
)
回到顶部