Flutter增强集合功能插件enchanted_collection的使用

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

Flutter增强集合功能插件enchanted_collection的使用

enchanted_collection 是一个强大的Flutter插件,提供了许多实用的数据结构和算法来增强集合的功能。本文将介绍如何使用这个插件,并提供一些示例代码。

安装

首先,在你的 pubspec.yaml 文件中添加 enchanted_collection 依赖:

dependencies:
  flutter:
    sdk: flutter
  enchanted_collection: ^1.0.0  # 请根据最新版本号进行修改

然后运行以下命令安装依赖:

flutter pub get

主要功能和示例

List Utils

For Each Mapper

这是一个带有附加信息的 forEach 函数,例如:是否是第一次迭代、是否是最后一次迭代、当前迭代的索引和值。

import 'package:enchanted_collection/enchanted_collection.dart';

void main() {
  final forEachMapperExample = [1, 2, 3];
  forEachMapperExample.forEachMapper((value, isFirst, isLast, index) {
    print('value: $value');
    print('isFirst: $isFirst');
    print('isLast: $isLast');
    print('index: $index');
  });
}

输出:

value: 1
isFirst: true
isLast: false
index: 0
value: 2
isFirst: false
isLast: false
index: 1
value: 3
isFirst: false
isLast: true
index: 2

Mapper

返回一个包含映射值的列表,每个迭代都带有附加信息。

final mapperExample = ['igor', 'miranda', 'souza'];
final List<Map<int, String>> mappedList = mapperExample.mapper((
  value,
  isFirst,
  isLast,
  index,
) {
  if (isFirst || isLast) {
    return {index: value.toUpperCase()};
  }
  return {index: value};
});
print(mappedList); // [{0: "IGOR"}, {1: "miranda"}, {2: "SOUZA"}]

Single Where or Null

类似于 singleWhere,但如果元素不存在则返回 null 而不是抛出错误。

final List<int> singleWhereOrNullList = [1, 2, 3];
// Will return null:
print(singleWhereOrNullList.singleWhereOrNull((e) => e == 4)); // null
// Will return 3:
print(singleWhereOrNullList.singleWhereOrNull((e) => e == 3)); // 3

Insert in Index

在指定索引位置插入新值并返回列表自身以便链式调用。

final insertInIndexExample = [1, 2, 4];
insertInIndexExample.insertInIndex(1, 3);
print(insertInIndexExample); // [1, 2, 3, 4]

Change Element in Index

更改指定索引位置的值并返回列表自身以便链式调用。

final changeListExample = [1, 2, 3];
changeListExample // cascade notation
    .changeAtIndexTo(0, 4)
    .changeAtIndexTo(1, 5)
    .changeAtIndexTo(2, 6);
print(changeListExample); // [4, 5, 6]

Add Value as Last Element of List

在列表末尾添加新值并返回列表自身以便链式调用。

final addInLastExample = [1, 2, 3];
addInLastExample // cascade notation
    .addInLast(4)
    .addInLast(5)
    .addInLast(6);
print(addInLastExample); // [1, 2, 3, 4, 5, 6]

Split into Groups

将列表拆分为若干组,每组包含指定数量的元素。

final splitIntoGroupsExample = [1, 2, 3, 4, 5, 6, 7];
final List<List<int>> groups = splitIntoGroupsExample.splitIntoGroups(3);
print(groups); // [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7 ] ]

Remove Null Elements of a List

移除列表中的 null 元素。

final withNullList = [1, 2, 3, null];
print(withNullList.removeNull); // [1, 2, 3]

Map Utils

Try Cast Map

尝试将 JSON 字符串解码为 Map,如果字符串无效则返回 null

final String invalidJson = 'invalid json';
final String validJson = '{"name": "igor"}';
print(invalidJson.tryDecode); // null
print(validJson.tryDecode); // {"name": "igor"}

Cast Functions

Transform a List into a Map

将列表转换为 Map,通过 onElementToKeyonElementToValue 函数处理每个元素。

final list = [
  {'name': 'igor', 'age': 23},
  {'name': 'miranda', 'age': 30},
];
final Map<String, int> persons = list.castToMap(
  (element) {
    return element['name'] as String;
  },
  (element) {
    return element['age'] as int;
  },
);
print(persons); // {
//   "igor": 23,
//   "miranda": 30
// }

Transform a Map into a List

将 Map 转换为列表,通过 toElementFunc 函数处理每个 Map 条目。

final Map<String, int> personsMap = {
  "Igor": 23,
  "Miranda": 30,
};
final List<String> personsList = personsMap.castToList(
  (key, value) {
    return 'My name is $key, and I have $value years old.';
  },
);
print(personsList); // [My name is Igor, and I have 23 years old., My name is Miranda, and I have 30 years old.]

Cast Object/Dynamic to Desired Type

将动态类型转换为目标类型。

final dynamic dynamicList = 3;
final int intList = dynamicList.castTo<int>();
print(intList); // 3

Integer Utils

提供了一些比较整数的方法。

final isBiggerThenTest = 4.isBiggerThen(6); // false
final isBiggerOrEqualThenTest = 4.isBiggerOrEqualThen(4); // true 
final isSmallerThenTest = 4.isSmallerThen(6); // true
final isSmallerOrEqualThenTest = 4.isSmallerOrEqualThen(4); // true

print(isBiggerThenTest);
print(isBiggerOrEqualThenTest);
print(isSmallerThenTest);
print(isSmallerOrEqualThenTest);

以上就是 enchanted_collection 插件的主要功能和使用示例。希望这些内容对你有所帮助!如果你喜欢这个插件,请给它一个点赞👍。


更多关于Flutter增强集合功能插件enchanted_collection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter增强集合功能插件enchanted_collection的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用enchanted_collection插件的示例代码。enchanted_collection是一个增强集合功能的Flutter插件,它提供了一些有用的集合扩展,比如循环列表(Circular List)、可观察的集合(Observable Collection)等。

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

dependencies:
  flutter:
    sdk: flutter
  enchanted_collection: ^2.0.0 # 请注意版本号,使用最新的稳定版本

然后,运行flutter pub get来获取依赖。

下面是一个使用enchanted_collectionCircularList的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Enchanted Collection Example'),
        ),
        body: Center(
          child: CircularListExample(),
        ),
      ),
    );
  }
}

class CircularListExample extends StatefulWidget {
  @override
  _CircularListExampleState createState() => _CircularListExampleState();
}

class _CircularListExampleState extends State<CircularListExample> {
  CircularList<int> _circularList;
  int _currentIndex = 0;

  @override
  void initState() {
    super.initState();
    // 初始化一个包含0到9的CircularList
    _circularList = CircularList<int>.fromList(List.generate(10, (index) => index));
  }

  void _nextItem() {
    setState(() {
      _currentIndex = (_currentIndex + 1) % _circularList.length;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'Current Item: ${_circularList[_currentIndex]}',
          style: TextStyle(fontSize: 24),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _nextItem,
          child: Text('Next Item'),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了一个包含0到9的CircularList。点击按钮时,会循环遍历这个列表,并显示当前项。CircularList的好处是当你尝试访问超出范围的索引时,它会自动从另一端开始计数,从而避免了数组越界错误。

此外,如果你想使用enchanted_collection中的ObservableList,以下是一个简单示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Observable List Example'),
        ),
        body: Center(
          child: ObservableListExample(),
        ),
      ),
    );
  }
}

class ObservableListExample extends StatefulWidget {
  @override
  _ObservableListExampleState createState() => _ObservableListExampleState();
}

class _ObservableListExampleState extends State<ObservableListExample> {
  ObservableList<String> _observableList;

  @override
  void initState() {
    super.initState();
    // 初始化一个ObservableList
    _observableList = ObservableList<String>.fromList(['Item 1', 'Item 2', 'Item 3']);

    // 添加监听器,监听列表变化
    _observableList.addListener(() {
      // 当列表变化时,调用setState刷新UI
      setState(() {});
    });
  }

  void _addItem() {
    // 添加新项到列表
    _observableList.add('New Item');
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Expanded(
          child: ListView.builder(
            itemCount: _observableList.length,
            itemBuilder: (context, index) {
              return ListTile(
                title: Text(_observableList[index]),
              );
            },
          ),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _addItem,
          child: Text('Add Item'),
        ),
      ],
    );
  }
}

在这个示例中,我们创建了一个ObservableList,并在列表变化时添加了一个监听器。每次向列表添加新项时,UI会自动刷新以显示最新的列表内容。

这些示例展示了enchanted_collection插件的一些基本用法。根据具体需求,你可以进一步探索和使用这个插件提供的其他功能。

回到顶部