Flutter集合通知管理插件collection_notifiers的使用

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

Flutter集合通知管理插件 collection_notifiers 的使用

collection_notifiers 是一个优化了重建和语法的Flutter插件,它通过将集合(如List、Set、Map等)与ChangeNotifierValueListenable接口结合,提供了一种高效的方式来处理集合的变化。

特性

  • 性能提升:对中大型集合有显著的性能优势。
  • 简洁的语法:最小化代码量,提供最佳的语法体验。
  • 兼容性:完全兼容ValueListenableBuilder和Riverpod/Provider。
  • 简单易用:使用非常简便。

使用示例

Riverpod/Provider 无 collection_notifiers

在没有使用collection_notifiers的情况下,每次修改集合都会触发setState并创建新的副本:

final setProvider = StateProvider((ref) => <E>{});

onAdd: (value) => ref.read(setProvider.state).update((state) {
  return <E>{...state, value}; // 创建新副本
});
onRemove: (value) => ref.read(setProvider.state).update((state) {
  return <E>{...state..remove(value)}; // 创建新副本
});

Riverpod/Provider 使用 collection_notifiers

使用collection_notifiers后,只有在需要时才会触发setState,并且不会创建任何副本:

final setProvider = ChangeNotifierProvider((ref) => SetNotifier<E>());

onAdd: ref.read(setProvider).add; // 不创建副本
onRemove: ref.read(setProvider).remove; // 不创建副本

对于ListMap,操作符也被重载:

final listProvider = ChangeNotifierProvider((ref) => ListNotifier([0]));
ref.read(listProvider)[0] = 1; // 触发setState
ref.read(listProvider)[0] = 1; // 不会再次触发setState

final mapProvider = ChangeNotifierProvider((ref) => MapNotifier());
ref.read(mapProvider)['a'] = 1; // 触发setState
ref.read(mapProvider)['a'] = 1; // 不会再次触发setState

实现细节

集合类型 状态 Notifier
Set 完成 SetNotifier
List 完成(见注释) ListNotifier
Map 完成 MapNotifier
Queue 完成 QueueNotifier

元素相等性

元素相等性(== 操作符)需要由开发者自行处理。推荐使用代码生成工具(如freezedbuilt_value等)或equatable库。

注意事项

  • collection_notifiers 不处理任何异常。
  • 被重写的逻辑方法总是模仿默认实现。
  • 需要集合相等性的方法(如sort()shuffle()等)总是会触发setState

示例Demo

以下是一个完整的示例,展示如何使用collection_notifiers来管理集合变化:

import 'package:collection_notifiers/collection_notifiers.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

void main() {
  runApp(const ProviderScope(child: App()));
}

class App extends StatelessWidget {
  const App({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
    );
  }
}

final notifier = SetNotifier<int>();

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Collection Notifiers Example')),
      body: ValueListenableBuilder<Set<int>>(
        valueListenable: notifier,
        builder: (context, value, child) {
          return ListView(
            children: [
              ...ListTile.divideTiles(
                context: context,
                tiles: List.generate(20, (index) {
                  return CheckboxListTile(
                    value: value.contains(index),
                    title: Text(index.toString()),
                    onChanged: (arg) {
                      if (arg == true) {
                        notifier.add(index);
                      } else {
                        notifier.remove(index);
                      }
                    },
                  );
                }),
              ),
            ],
          );
        },
      ),
    );
  }
}

在这个示例中,我们使用SetNotifier来管理一个整数集合,并通过ValueListenableBuilder来监听集合的变化。用户可以通过点击复选框来添加或移除集合中的元素,UI会自动更新以反映这些变化。


更多关于Flutter集合通知管理插件collection_notifiers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集合通知管理插件collection_notifiers的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 collection_notifiers 插件的示例代码案例。collection_notifiers 是一个用于在 Flutter 中管理集合更改通知的插件,它允许你监听集合(如 List、Set、Map)的变化并作出响应。

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

dependencies:
  flutter:
    sdk: flutter
  collection_notifiers: ^x.y.z  # 请替换为最新版本号

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

接下来是一个完整的 Flutter 应用示例,展示了如何使用 collection_notifiers 来管理集合的更改通知。

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  // 创建一个可观察的列表
  final ListNotifier<String> listNotifier = ListNotifier<String>([]);

  void addItem() {
    // 向列表中添加一个新项
    String newItem = 'Item ${listNotifier.value.length + 1}';
    listNotifier.add(newItem);
  }

  void removeItem(String item) {
    // 从列表中移除一个项
    listNotifier.remove(item);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Collection Notifiers Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Expanded(
              child: ListView.builder(
                itemCount: listNotifier.value.length,
                itemBuilder: (context, index) {
                  String item = listNotifier.value[index];
                  return Dismissible(
                    key: Key(item),
                    onDismissed: (direction) {
                      removeItem(item);
                    },
                    child: ListTile(
                      title: Text(item),
                    ),
                  );
                },
              ),
            ),
            ElevatedButton(
              onPressed: addItem,
              child: Text('Add Item'),
            ),
          ],
        ),
      ),
    );
  }

  // 监听集合变化(可选,仅用于演示)
  @override
  void initState() {
    super.initState();
    listNotifier.addListener(() {
      print('List changed: ${listNotifier.value}');
    });
  }

  @override
  void dispose() {
    // 移除监听器(重要,避免内存泄漏)
    listNotifier.removeListener(() {});
    super.dispose();
  }
}

在这个示例中:

  1. 我们创建了一个 ListNotifier<String> 实例来管理一个字符串列表。
  2. 提供了两个方法 addItemremoveItem 来分别向列表中添加和移除项。
  3. build 方法中,我们使用 ListView.builder 来渲染列表项,并使用 Dismissible 小部件允许用户通过滑动来移除项。
  4. 使用 ElevatedButton 添加了一个按钮,用于向列表中添加新项。
  5. initState 方法中,我们添加了一个监听器来打印集合的变化(这一步是可选的,仅用于演示监听功能)。
  6. dispose 方法中,我们移除了监听器以避免内存泄漏。

这样,你就可以使用 collection_notifiers 插件来管理集合的更改通知,并在 UI 中作出相应的响应。

回到顶部