Flutter唯一列表管理插件x_unique_list的使用

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

Flutter唯一列表管理插件x_unique_list的使用

XUniqueList 是一个工具包,可以根据您定义的自定义条件确保列表中的唯一性。它非常适合管理必须遵循特定唯一性规则的对象集合。

📜 目录

  • ✨ 特点
  • 🚀 开始使用
  • 📝 使用方法
  • 🧩 方法
  • 🔙 下一步
  • 📄 许可证

✨ 特点

  • 🆕 唯一列表管理:添加、插入或删除项目时,确保基于自定义条件的无重复。
  • 🚀 快速操作:优化了添加、删除和过滤项目的操作。
  • 🔄 替换与修改:根据条件或唯一值替换项目。
  • 🔍 检查存在性:快速检查项目是否基于唯一性条件存在。
  • 📦 不可修改和可修改访问:根据需要检索不可修改和可修改版本的列表。

🚀 开始使用

要开始使用 XUniqueList,您需要在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  x_unique_list: ^1.0.5

然后运行以下命令以获取依赖项:

flutter pub get

📝 使用方法

以下是如何使用 XUniqueList 的示例,该示例基于 User 类的 id 字段定义了一个自定义的唯一条件:

import 'package:x_unique_list/x_unique_list.dart';

class User {
  final int id;
  final String name;

  User(this.id, this.name);

  [@override](/user/override)
  String toString() => 'User(id: $id, name: $name)';

  // 覆盖相等运算符以比较 id 和 name
  [@override](/user/override)
  bool operator ==(Object other) =>
      identical(this, other) ||
      (other is User && id == other.id && name == other.name);

  [@override](/user/override)
  int get hashCode => Object.hash(id, name);
}

void main() {
  // 定义唯一条件(在此示例中,用户通过其 ID 唯一)
  final uniqueUsers = XUniqueList<User>((user) => user.id);

  // 添加用户
  uniqueUsers.add(User(1, 'Ahmad'));
  uniqueUsers.add(User(2, 'Nour'));

  // 尝试添加重复用户(不会被添加)
  uniqueUsers.add(User(1, 'Ahmad')); // 这不会被添加,因为 ID 1 已经存在

  // 获取用户的不可修改列表
  print(uniqueUsers.items); // [User(id: 1, name: Ahmad), User(id: 2, name: Nour)]

  // 移除用户 - ⚠️ 注意:
  // 如果不覆盖 `==` 和 `hashCode`,此操作可能无法按预期工作
  uniqueUsers.remove(User(2, 'Nour'));

  // 解释:
  // `remove` 方法使用 `==` 运算符来检查项目是否匹配。
  // 默认情况下,Dart 按对象的内存引用进行比较,而不是对象内部的字段。
  // 若要使此操作正常工作,您需要手动覆盖模型的 `==` 运算符和 `hashCode`
  // (如上所示),或者使用第三方库,如 `equatable` 或 `freezed` 等。

  // 作为替代方案,您可以使用 `removeOneWhere` 方法根据条件移除项目
  uniqueUsers.removeOneWhere((user) => user.id == 2); // 即使没有 `==` 覆盖也可以正常工作

  // 检查列表是否包含用户
  // ⚠️ 关于 `contains` 方法的重要说明
  // 
  // `XUniqueList` 中的 `contains` 方法依赖于您定义的唯一条件。
  // 在上面的示例中,唯一条件基于 `User` 类的 `id` 字段。
  // 
  // 这意味着当您使用 `contains` 检查项目是否存在时,
  // 它只考虑由 `uniqueCondition` 函数提供的值,而不是整个对象。
  // 
  // 例如:
  bool exists = uniqueUsers.contains(User(1, 'Ahmad'));
  print(exists); // true
  // 即使名称 'Ahmad' 与任何现有用户不同,`contains` 方法返回 true
  // 因为字段(即唯一条件)与现有用户(ID = 1)匹配。
  
  // 要基于不同的标准(例如名称)检查存在性或移除项目,
  // 您可以使用 `removeOneWhere` 方法,该方法允许更复杂的基于条件的逻辑。
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用x_unique_list插件的一个示例代码案例。这个插件通常用于管理唯一列表项,确保列表中不会有重复项。

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

dependencies:
  flutter:
    sdk: flutter
  x_unique_list: ^latest_version # 请替换为实际的最新版本号

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

接下来,以下是一个完整的示例代码,展示了如何使用x_unique_list插件来管理一个唯一列表:

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

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

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

class UniqueListDemo extends StatefulWidget {
  @override
  _UniqueListDemoState createState() => _UniqueListDemoState();
}

class _UniqueListDemoState extends State<UniqueListDemo> {
  final UniqueListController<String> _controller = UniqueListController<String>();

  @override
  void initState() {
    super.initState();
    // 初始化时添加一些数据
    _controller.addAll(['Apple', 'Banana', 'Cherry']);
  }

  void _addItem(String item) {
    _controller.add(item);
  }

  void _removeItem(String item) {
    _controller.remove(item);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Unique List Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Expanded(
              child: ListView.builder(
                itemCount: _controller.length,
                itemBuilder: (context, index) {
                  final item = _controller[index];
                  return ListTile(
                    title: Text(item),
                    trailing: IconButton(
                      icon: Icon(Icons.delete),
                      onPressed: () => _removeItem(item),
                    ),
                  );
                },
              ),
            ),
            TextField(
              decoration: InputDecoration(
                labelText: 'Add Item',
              ),
              onEditingComplete: () {
                final inputController = TextEditingController.fromValue(
                  TextField.focusNodeOf(context)?.controller?.value ??
                      TextEditingValue.empty,
                );
                _addItem(inputController.text);
                inputController.clear();
                FocusScope.of(context).unfocus();
              },
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // Example: trying to add a duplicate item (won't be added)
          _addItem('Apple'); // This won't add "Apple" again if it's already in the list
        },
        tooltip: 'Add Duplicate Item',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释:

  1. 依赖导入:在pubspec.yaml文件中添加x_unique_list依赖。
  2. 控制器初始化:在UniqueListDemo的状态类中初始化一个UniqueListController<String>对象。
  3. 初始数据:在initState方法中,向控制器添加一些初始数据。
  4. 添加和移除项:定义_addItem_removeItem方法来添加和移除列表项。
  5. UI构建:使用ListView.builder来显示列表项,每个项都是一个ListTile,并带有一个删除按钮。
  6. 文本输入:使用TextField来输入新项,并在onEditingComplete回调中添加该项。
  7. 浮动按钮:添加一个浮动按钮,用于演示尝试添加重复项(如果项已经存在,则不会添加)。

这样,你就可以使用x_unique_list插件来管理一个唯一列表,并确保列表中不会有重复项。

回到顶部