Flutter集合通知管理插件collection_notifiers的使用
Flutter集合通知管理插件 collection_notifiers
的使用
collection_notifiers
是一个优化了重建和语法的Flutter插件,它通过将集合(如List、Set、Map等)与ChangeNotifier
和ValueListenable
接口结合,提供了一种高效的方式来处理集合的变化。
特性
- 性能提升:对中大型集合有显著的性能优势。
- 简洁的语法:最小化代码量,提供最佳的语法体验。
- 兼容性:完全兼容
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; // 不创建副本
对于List
和Map
,操作符也被重载:
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 |
元素相等性
元素相等性(==
操作符)需要由开发者自行处理。推荐使用代码生成工具(如freezed
、built_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
更多关于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();
}
}
在这个示例中:
- 我们创建了一个
ListNotifier<String>
实例来管理一个字符串列表。 - 提供了两个方法
addItem
和removeItem
来分别向列表中添加和移除项。 - 在
build
方法中,我们使用ListView.builder
来渲染列表项,并使用Dismissible
小部件允许用户通过滑动来移除项。 - 使用
ElevatedButton
添加了一个按钮,用于向列表中添加新项。 - 在
initState
方法中,我们添加了一个监听器来打印集合的变化(这一步是可选的,仅用于演示监听功能)。 - 在
dispose
方法中,我们移除了监听器以避免内存泄漏。
这样,你就可以使用 collection_notifiers
插件来管理集合的更改通知,并在 UI 中作出相应的响应。