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

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

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

unique_list 是一个实现 List 的 Dart 包,它确保列表中的所有元素都是唯一的。这个包的行为类似于 Set,但提供了更多功能和灵活性。以下是如何使用 unique_list 插件的详细说明,并附带一个完整的示例 Demo。

1. 引入插件

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

dependencies:
  unique_list: ^latest_version

然后运行 flutter pub get 来安装插件。

2. 基本用法

UniqueListList 的一个实现,它不允许列表中存在重复的元素。元素的唯一性是通过 == 操作符来判断的。UniqueList 实现了 List 接口,因此可以像普通 List 一样使用。

创建 UniqueList

  • 创建空的 UniqueList

    final list = UniqueList();
  • 创建空的 UniqueList<int>

    final integers = UniqueList<int>();
  • 创建固定长度的 UniqueList<int>

    final fiveIntegers = UniqueList<int>(5);

默认情况下,UniqueList 不允许多个 null 值存在,除非创建的是固定长度的列表。如果你想创建一个允许多个 null 值的 UniqueList,可以使用 nullable 参数:

final list = UniqueList.empty(nullable: true);

3. 严格模式(Strict Lists)

默认情况下,UniqueList 行为类似于 Set,当尝试添加已经存在的元素时,列表不会发生变化。如果你希望在这种情况下抛出异常,可以使用 strict 构造函数:

final strictList = UniqueList<int>.strict();

strictList.addAll([0, 1, 2]);

try {
  strictList.add(0); // 这将抛出 DuplicateValueError
} catch (e) {
  print(e); // 输出错误信息
}

4. 工厂构造函数

UniqueList 提供了与普通 List 相同的工厂构造函数,除了 List.filled,因为 filled 生成的值不是唯一的。

UniqueList.from

从另一个列表创建 UniqueList

final list = UniqueList<int>.from([0, 1, 2]);

你可以通过 strictnullable 参数来控制行为:

final strict = UniqueList<int>.from([0, 1, 2], strict: true);
final nullable = UniqueList<int>.from([0, 1, 2], nullable: true);

UniqueList.of

从可迭代对象创建 UniqueList

final list = UniqueList<int>.of([0, 1, 2]);

同样可以使用 strictnullable 参数:

final strict = UniqueList<int>.of([0, 1, 2], strict: true);
final nullable = UniqueList<int>.of([0, 1, 2], nullable: true);

UniqueList.generate

使用生成器创建 UniqueList

final list = UniqueList<int>.generate(5, (index) => index); // [0, 1, 2, 3, 4]

也可以使用 strictnullable 参数:

final strict = UniqueList<int>.generate(5, (index) => index, strict: true);
final nullable = UniqueList<int>.generate(5, (index) => index, nullable: true);

UniqueList.unmodifiable

创建不可修改的 UniqueList

final list = UniqueList<int>.unmodifiable([0, 1, 2]);

对于不可修改的列表,strict 参数是不必要的,但你可以使用 nullable 参数:

final nullable = UniqueList<int>.unmodifiable([0, 1, 2], nullable: true);

5. 添加和插入元素

在非严格模式下,addaddAll 方法会忽略重复的元素。而在严格模式下,尝试添加重复元素会抛出 DuplicateValueError

addaddAll

final list = UniqueList<int>.from([0, 1, 2]);

print(list); // [0, 1, 2]

list.add(3);

print(list); // [0, 1, 2, 3]

list.add(2);

print(list); // [0, 1, 2, 3]

list.addAll([0, 1, 4, 5]);

print(list); // [0, 1, 2, 3, 4, 5]

insertinsertAll

插入元素时,如果插入的元素已经存在于列表中,现有的重复元素会被移除,索引也会相应调整。

final list = UniqueList<int>.from([0, 1, 2]);

print(list); // [0, 1, 2]

list.insert(0, 3);

print(list); // [3, 0, 1, 2]

list.insert(3, 3);

print(list); // [0, 1, 2, 3]

list.insertAll(3, [0, 1, 2]);

print(list); // [3, 0, 1, 2]

6. 设置值

使用 setAllsetRangefirstlast[]= 操作符设置值时,如果结果列表包含重复元素,将会抛出 DuplicateValueError

final list = UniqueList<int>.from([0, 1, 2]);

print(list); // [0, 1, 2]

try {
  list.setAll(0, [0, 1, 2]); // 抛出 DuplicateValueError
} catch (e) {
  print(e); // 输出错误信息
}

list.setRange(1, 2, [3, 4]);

print(list); // [0, 3, 4]

try {
  list.setRange(0, 1, [2, 3]); // 抛出 DuplicateValueError
} catch (e) {
  print(e); // 输出错误信息
}

7. toUniqueList 扩展方法

为了与 List 的行为保持一致,unique_list 包扩展了 Iterable,提供了一个 toUniqueList 方法。该方法可以将 Iterable 转换为 UniqueList

var list = UniqueList<int>.from([0, 1, 2, 3, 4]);

final reversed = list.reversed.toUniqueList();

print(reversed); // [4, 3, 2, 1, 0]

8. 完整示例 Demo

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

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Unique List Demo')),
        body: UniqueListDemo(),
      ),
    );
  }
}

class UniqueListDemo extends StatefulWidget {
  [@override](/user/override)
  _UniqueListDemoState createState() => _UniqueListDemoState();
}

class _UniqueListDemoState extends State<UniqueListDemo> {
  final UniqueList<int> _list = UniqueList<int>();

  void _addItem(int item) {
    try {
      _list.add(item);
      setState(() {});
    } catch (e) {
      print('Error: $e');
    }
  }

  void _removeItem(int item) {
    _list.remove(item);
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        ElevatedButton(
          onPressed: () => _addItem(1),
          child: Text('Add 1'),
        ),
        ElevatedButton(
          onPressed: () => _addItem(2),
          child: Text('Add 2'),
        ),
        ElevatedButton(
          onPressed: () => _addItem(3),
          child: Text('Add 3'),
        ),
        ElevatedButton(
          onPressed: () => _removeItem(1),
          child: Text('Remove 1'),
        ),
        ElevatedButton(
          onPressed: () => _removeItem(2),
          child: Text('Remove 2'),
        ),
        ElevatedButton(
          onPressed: () => _removeItem(3),
          child: Text('Remove 3'),
        ),
        Expanded(
          child: ListView.builder(
            itemCount: _list.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text('${_list[index]}'),
              );
            },
          ),
        ),
      ],
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用unique_list插件的代码示例。unique_list插件通常用于管理唯一列表项,确保列表中没有重复的项。不过,需要注意的是,unique_list并不是Flutter官方或者广泛认知的第三方插件,这里假设它是一个自定义的或小众的插件,并提供一个类似的实现逻辑代码示例。

如果unique_list插件存在,其使用方式可能类似于以下代码。但为了说明目的,我将展示一个如何在Flutter中实现唯一列表管理的示例,这个示例将不使用假设的unique_list插件,而是使用Flutter的基础功能来实现相同的效果。

示例代码

首先,确保你的pubspec.yaml文件中已经添加了Flutter的依赖项(这里主要是flutter本身,因为我们不依赖外部插件):

dependencies:
  flutter:
    sdk: flutter

然后,创建一个Flutter应用,并在其中实现唯一列表管理。

import 'package:flutter/material.dart';

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

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

class UniqueListScreen extends StatefulWidget {
  @override
  _UniqueListScreenState createState() => _UniqueListScreenState();
}

class _UniqueListScreenState extends State<UniqueListScreen> {
  final Set<String> _uniqueItems = Set<String>(); // 使用Set来确保唯一性
  final TextEditingController _controller = TextEditingController();

  void _addItem() {
    final String newItem = _controller.text.trim();
    if (newItem.isNotEmpty && !_uniqueItems.contains(newItem)) {
      setState(() {
        _uniqueItems.add(newItem);
      });
      _controller.clear();
    } else if (newItem.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Item cannot be empty!')),
      );
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Item already exists!')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Unique List Management'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter new item',
              ),
            ),
            SizedBox(height: 16),
            Expanded(
              child: ListView.builder(
                itemCount: _uniqueItems.length,
                itemBuilder: (context, index) {
                  final String item = _uniqueItems.elementAt(index);
                  return ListTile(
                    title: Text(item),
                  );
                },
              ),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _addItem,
        tooltip: 'Add item',
        child: Icon(Icons.add),
      ),
    );
  }
}

代码解释

  1. 使用Set来存储唯一项Set数据结构天然保证了其元素的唯一性,因此非常适合用于管理唯一列表项。

  2. 添加新项的逻辑:在_addItem方法中,首先检查输入是否为空,然后检查该项是否已存在于Set中。如果不存在,则添加到Set中,并清除文本输入框。如果输入为空或项已存在,则显示相应的SnackBar消息。

  3. UI构建:UI部分包括一个文本输入框用于输入新项,一个ListView.builder用于显示当前列表项,以及一个浮动操作按钮用于触发添加操作。

这个示例展示了如何在Flutter中不使用任何特定插件来实现唯一列表管理。如果你使用的unique_list插件有特定的API或方法,你可能需要参考其官方文档或源代码来调整上述示例。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!