Flutter列表工具插件list_utilities的使用

Flutter列表工具插件list_utilities的使用

list_utilities

list_utilities 是一个包含基本扩展方法的库,用于 [Iterable][List][Set]。它还包含一个基类,用于实现更高层次的 [List] 实现。

使用

import 'package:list_utilities/list_utilities.dart';

Iterable 方法

扩展 [Iterable] 的方法也可用在 [List][Set] 或其他 [Iterable] 的实现上。

随机

random 方法从可迭代对象中返回一个随机值。

final numbers = <int>[0, 1, 2, 3, 4];
print(numbers.random()); // 3 (或其它数字)

匹配

matches 方法返回 true,如果另一个可迭代对象与调用者具有相同的长度,并且包含所有相同的元素。

matches 有一个可选参数 [ordered],如果为 true,则需要每个可迭代对象中的元素顺序相同才能满足 [matches]

final numbersA = <int>{1, 2, 3, 4, 5};
final numbersB = <int>{5, 4, 3, 2, 1};
print(numbersA.matches(numbersB)); // true
print(numbersA.matches(numbersB, ordered: true)); // false

List 方法

获取随机

getRandom 方法返回一个新的集合,其中包含来自集合的随机元素。

final numbers = <int>[0, 1, 2, 3, 4];
print(numbers.getRandom(3)); // [3, 1, 4] (或任何其他组合)

移除随机

removeRandom 方法从列表中随机移除并返回一个元素。

final numbers = <int>[0, 1, 2, 3, 4];
print(numbers.removeRandom()); // 3 (或任何其他数字)
print(numbers); // [0, 1, 2, 4]

注意removeRandom 仅在 [List][Set] 中可用,但不在 [Iterable] 中,因为 [Iterable] 缺乏移除元素的方法,除非先将其转换为 [List][Set]

移除空值

removeNull 方法从列表中移除所有的 null 值。

final numbers = <int>[0, 1, null, 3, null];
numbers.removeNull();
print(numbers); // [0, 1, 3]

移除第一个

removeFirst 方法移除列表中的第一个项目。

final numbers = <int>[0, 1, 2, 3, 4];
print(numbers.removeFirst()); // 0
print(numbers); // [1, 2, 3, 4]

移除第一个满足条件的

removeFirstWhere 方法遍历列表并移除第一个满足测试条件的元素。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.removeFirstWhere((number) => number.isOdd);
print(numbers); // [0, 2, 3, 4]

移除最后一个满足条件的

removeLastWhere 方法反向遍历列表并移除第一个满足测试条件的元素。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.removeLastWhere((number) => number.isOdd);
print(numbers); // [0, 1, 2, 4]

移动位置

shift 方法移动列表中元素的顺序。

shift 可以提供一个正数来将元素向上移动列表,或提供一个负数来将元素向下移动列表。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.shift(2);
print(numbers); // [3, 4, 0, 1, 2]
numbers.shift(-3);
print(numbers); // [1, 2, 3, 4, 0];

提取子集

pluck 方法从指定的开始位置到结束位置(如果 endnull 则到列表末尾)移除并返回一个子集的元素。

final numbers = <int>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
print(numbers.pluck(3, 8)); // [3, 4, 5, 6, 7]
print(numbers); // [0, 1, 2, 8, 9]

调整大小并填充

resizeAndFill 方法根据提供的值添加或删除列表中的元素。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.resizeAndFill(-2, 0);
print(numbers); // [0, 1, 2]
numbers.resizeAndFill(2, 0);
print(numbers); // [0, 1, 2, 0, 0]

调整大小并生成

resizeAndGenerate 方法根据提供的生成器添加或删除列表中的元素。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.resizeAndGenerate(5, (index) => index);
print(numbers); // [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
numbers.resizeAndGenerate(-5, (index) => index);
print(numbers); // [0, 1, 2, 3, 4]

移除指定数量的元素

removeFrom 方法从指定的索引开始移除指定数量的元素。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.removeFrom(3, 2);
print(numbers); // [0, 1, 2]
numbers.removeFrom(0, 2);
print(numbers); // [2]

从列表末尾移除指定数量的元素

removeFromEnd 方法从列表末尾移除指定数量的元素。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.removeFromEnd(2);
print(numbers); // [0, 1, 2]

更新指定索引的元素

transform 方法更新指定索引处的元素为其提供的转换函数返回的值。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.transform(2, (number) => number * 2);
print(numbers); // [0, 1, 4, 3, 4]

更新列表中的所有元素

transformAll 方法更新列表中的每个元素为其提供的转换函数返回的值。

final numbers = <int>[0, 1, 2, 3, 4];
numbers.transformAll((number) => number * 2);
print(numbers); // [0, 2, 4, 6, 8]

计算某个对象的实例数量

count 方法返回列表中提供的对象的实例数量。

final numbers = <int>[0, 0, 1, 2, 1, 0, 0];
print(numbers.count(0)); // 4
print(numbers.count(1)); // 2
print(numbers.count(2)); // 1

Set 方法

获取随机

getRandom 方法返回一个包含来自集合的随机元素的新集合。

final numbers = <int>{0, 1, 2, 3, 4};
print(numbers.getRandom(3)); // {3, 1, 4} (或任何其他组合)

移除随机

removeRandom 方法从集合中随机移除并返回一个元素。

final numbers = <int>{0, 1, 2, 3, 4};
print(numbers.removeRandom()); // 3 (或任何其他数字)
print(numbers); // {0, 1, 2, 4}

注意removeRandom 仅在 [List][Set] 中可用,但不在 [Iterable] 中,因为 [Iterable] 缺乏移除元素的方法,除非先将其转换为 [List][Set]

移除第一个

removeFirst 方法移除集合中的第一个元素并返回被移除的元素。

final numbers = <int>{0, 1, 2, 3, 4};
print(numbers.removeFirst()); // 0
print(numbers); // {1, 2, 3, 4}

移除最后一个

removeLast 方法移除集合中的最后一个元素并返回被移除的元素。

final numbers = <int>{0, 1, 2, 3, 4};
print(numbers.removeLast()); // 4
print(numbers); // {0, 1, 2, 3}

移除范围内的元素

removeRange 方法移除集合中的范围内的元素。

注意:此方法不应在无序集合(如 [HashSet])上使用。

final numbers = <int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
numbers.removeRange(3, 8);
print(numbers); // {0, 1, 2, 8, 9}

移动位置

shift 方法移动集合中元素的顺序。

shift 可以提供一个正数来将元素向上移动集合,或提供一个负数来将元素向下移动集合。

final numbers = <int>{0, 1, 2, 3, 4};
numbers.shift(2);
print(numbers); // {3, 4, 0, 1, 2}
numbers.shift(-3);
print(numbers); // {1, 2, 3, 4, 0};

提取子集

pluck 方法从指定的开始位置到结束位置(如果 endnull 则到集合末尾)移除并返回一个子集的元素。

注意:此方法不应在无序集合(如 [HashSet])上使用。

final numbers = <int>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
print(numbers.pluck(3, 8)); // {3, 4, 5, 6, 7}
print(numbers); // {0, 1, 2, 8, 9}

合并两个集合

+ 运算符返回一个新的 [Set],通过将第二个 [Set] 的值追加到第一个 [Set] 的末尾。

final numbersA = <int>{1, 2, 3};
final numbersB = <int>{4, 5, 6};
print(numbersA + numbersB); // {1, 2, 3, 4, 5, 6}

base_list

import 'package:list_utilities/base_list.dart';

base_list 库暴露了一个抽象类 [BaseList],以及一组 typedef 供实现类重写方法时使用。

[BaseList] 实现了 [List<E>] 并包装了另一个 [List<E>],即 [BaseList] 的方法接口与之交互的 [elements]

[BaseList] 用于在需要实现新类型的列表但不必定制所有必要的列表方法的情况下。

[List] 不同,[BaseList] 需要 [growable] 参数;这不一定意味着包装的列表 [elements] 是否为固定长度列表。

注意:修改 [elements] 长度的重写方法应尊重 [growable],并在用户尝试修改列表长度时抛出 [UnsupportedError],无论 [elements] 是否为固定长度列表。

/// 一个实现了 `List<E>` 的类,该类存储了一个列表,
/// 即使这些元素后来已被删除。
class HistoryList<E> extends BaseList<E> {
  const HistoryList() : super([], growable: true);

  List<E> get history => List<E>.from(_history);

  final _history = <E>[];

  [@override](/user/override)
  void add(E value) {
    elements.add(value);
    _history.add(value);
  }

  [@override](/user/override)
  void addAll(Iterable<E> iterable) {
    elements.addAll(iterable);
    _history.addAll(iterable);
  }

  [@override](/user/override)
  void insert(int index, E element) {
    elements.insert(index, element);
    _history.add(element);
  }

  [@override](/user/override)
  void insertAll(int index, Iterable<E> iterable) {
    elements.insertAll(index, iterable);
    _history.addAll(iterable);
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用list_utilities插件的示例代码。请注意,list_utilities并非Flutter官方插件,所以假设它提供了一些常见的列表操作功能,如排序、过滤、分页等。由于具体API可能不同,以下代码是一个假设性的示例,但会展示如何使用类似的插件进行列表操作。

首先,确保你的pubspec.yaml文件中包含了对list_utilities的依赖:

dependencies:
  flutter:
    sdk: flutter
  list_utilities: ^x.y.z  # 替换为实际版本号

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

接下来,在你的Dart文件中使用list_utilities插件。以下是一个简单的示例,展示如何排序、过滤和分页列表:

import 'package:flutter/material.dart';
import 'package:list_utilities/list_utilities.dart';  // 假设这是插件的导入路径

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  List<Map<String, dynamic>> items = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35},
    // 更多数据...
  ];

  List<Map<String, dynamic>> filteredItems = [];
  List<Map<String, dynamic>> sortedItems = [];
  List<Map<String, dynamic>> pagedItems = [];

  @override
  void initState() {
    super.initState();
    applyFiltersAndSorting();
    applyPaging(page: 1, pageSize: 2);
  }

  void applyFiltersAndSorting() {
    // 过滤:仅保留年龄大于25的项
    filteredItems = items.where((item) => item['age']! > 25).toList();

    // 排序:按年龄升序排序
    sortedItems = filteredItems..sortedBy((a, b) => a['age']!.compareTo(b['age']!));

    setState(() {});
  }

  void applyPaging(int page, int pageSize) {
    int start = (page - 1) * pageSize;
    int end = start + pageSize;
    pagedItems = sortedItems.sublist(start, end);

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('List Utilities Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            Text('Filtered and Sorted List:'),
            ListView.builder(
              itemCount: sortedItems.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('${sortedItems[index]['name']} - ${sortedItems[index]['age']}'),
                );
              },
            ),
            SizedBox(height: 20),
            Text('Paged List (Page 1, Page Size 2):'),
            ListView.builder(
              itemCount: pagedItems.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text('${pagedItems[index]['name']} - ${pagedItems[index]['age']}'),
                );
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 假设这是切换页码的动作,这里只是简单示例
          setState(() {
            applyPaging(page: 2, pageSize: 2);
          });
        },
        tooltip: 'Next Page',
        child: Icon(Icons.navigate_next),
      ),
    );
  }
}

说明

  1. 依赖添加:在pubspec.yaml中添加list_utilities依赖。
  2. 数据初始化:在_MyHomePageState中初始化了一个包含字典的列表items
  3. 过滤和排序:使用where方法进行过滤,使用sortedBy方法进行排序(注意:这里sortedBy是假设的方法,实际插件可能有不同的API)。
  4. 分页:使用sublist方法实现简单的分页逻辑。
  5. UI展示:使用ListView.builder展示过滤和排序后的列表,以及分页后的列表。
  6. 分页切换:使用FloatingActionButton模拟页码切换。

请注意,由于list_utilities并非实际存在的官方插件,因此上述代码中的某些方法(如sortedBy)是假设的。你需要根据实际插件提供的API进行调整。如果list_utilities插件提供的功能与假设的不同,请参考其官方文档进行调整。

回到顶部