Flutter通知管理插件iris_notifier的使用
Flutter通知管理插件iris_notifier的使用
本文将详细介绍如何在Flutter项目中使用iris_notifier插件来管理事件、数据和状态的通知。iris_notifier是一个功能强大的通知管理库,适用于客户端和服务器端应用。
Iris
插件简介
iris_notifier 是一个用于事件、数据和状态通知的库,分为三个独立的类:
DataNotifierService:用于数据通知。EventNotifierService:用于事件通知。StateNotifier:用于状态管理和通知。
此库支持Dart和Flutter项目。
使用 DataNotifierService
DataNotifierService 可以用来监听和发布数据。
创建 Key
首先,我们需要创建一个唯一的键(key):
class PublicAccess {
PublicAccess._();
// 使用 generateKey 方法生成一个唯一的 key
static final newDataNotifier = DataNotifierService.generateKey();
// 或者通过字符串生成 key
static final newDataNotifier2 = DataNotifierKey.by('myKey');
}
添加监听器
接下来,我们可以为 newDataNotifier 添加监听器:
class ExampleForDataNotifier {
/// 添加监听器
static void dataNotifier$addListener() {
DataNotifierService.addListener(PublicAccess.newDataNotifier, dataNotifierListener1);
DataNotifierService.addListener(PublicAccess.newDataNotifier, dataNotifierListener2);
}
/// 移除监听器
static void dataNotifier$removeListener() {
DataNotifierService.removeListener(PublicAccess.newDataNotifier, dataNotifierListener1);
DataNotifierService.removeListener(PublicAccess.newDataNotifier, dataNotifierListener2);
}
/// 发布数据
static void startNotifier() {
Timer.periodic(Duration(seconds: 5), (timer) {
// 如果有监听器,则发布数据
DataNotifierService.notify(PublicAccess.newDataNotifier, {'hi': 'user', 'tick': '${timer.tick}'});
});
}
/// 第一个监听器
static void dataNotifierListener1(data) {
if (data is Map) {
print('listener1: $data');
}
}
/// 第二个监听器
static void dataNotifierListener2(data) {
if (data is Map) {
print('listener2: $data');
}
}
/// 使用 Stream 订阅数据
static void startListening() {
StreamSubscription? sub1;
StreamSubscription? sub2;
// 监听数据流
sub1 = DataNotifierService.getStream<Map>(PublicAccess.newDataNotifier).listen((data) {
print('stream listener1: $data');
sub1!.cancel(); // 取消订阅
});
sub2 = DataNotifierService.getStream<Map>(PublicAccess.newDataNotifier).listen((data) {
print('stream listener2: $data');
sub2!.cancel(); // 取消订阅
});
}
}
使用 EventNotifierService
EventNotifierService 用于在事件发生时通知监听器。
创建枚举或类
首先,定义一个实现 EventImplement 的枚举或类:
enum EventList implements EventImplement {
networkConnected(100),
networkDisConnected(101),
networkStateChange(102),
webSocketConnected(105),
webSocketDisConnected(106),
webSocketStateChange(107),
userProfileChange(110),
userLogin(111),
userLogoff(112);
final int _number;
const EventList(this._number);
int getNumber() {
return _number;
}
}
添加监听器并发布事件
然后,可以添加监听器并发布事件:
class ExampleForEventNotifier {
/// 添加监听器
static void eventNotifier$addListener() {
EventNotifierService.addListener(EventList.networkConnected, eventNotifierListener1);
EventNotifierService.addListener(EventList.networkDisConnected, eventNotifierListener2);
}
/// 移除监听器
static void eventNotifier$removeListener() {
EventNotifierService.removeListener(EventList.networkConnected, eventNotifierListener1);
EventNotifierService.removeListener(EventList.networkDisConnected, eventNotifierListener2);
}
/// 发布事件
static void startNotifier() {
Timer.periodic(Duration(seconds: 5), (timer) {
EventNotifierService.notify(EventList.networkConnected); // 发布网络连接事件
EventNotifierService.notify(EventList.userLogin, data: {'name': 'user-name'}); // 发布登录事件
});
}
/// 第一个事件监听器
static void eventNotifierListener1({data}) {
print('net is ok, $data');
}
/// 第二个事件监听器
static void eventNotifierListener2({data}) {
print('oh net is disconnect, $data');
}
/// 使用 Stream 订阅事件
static void startListening() {
StreamSubscription? sub1;
StreamSubscription? sub2;
// 监听用户登录事件
sub1 = EventNotifierService.getStream<Map>(EventList.userLogin).listen((data) {
print('stream listener1: $data');
sub1!.cancel(); // 取消订阅
});
sub2 = EventNotifierService.getStream<Map>(EventList.userLogin).listen((data) {
print('stream listener2: $data');
sub2!.cancel(); // 取消订阅
});
}
}
使用 StateNotifier
StateNotifier 用于状态管理和通知。
创建状态类
首先,创建一个继承自 StateHolder 的类:
enum StateList {
error,
wait,
ok;
}
class StateStructure extends StateHolder<StateList> {
bool isRequested = false;
bool isRequesting = false;
bool isOk() {
return isRequested && !isRequesting && !hasStates({StateList.error, StateList.wait});
}
}
创建状态通知器
然后,创建一个 StateNotifier 实例:
class PublicAccess {
PublicAccess._();
static final StateStructure stateStructure = StateStructure();
static final StateNotifier<StateStructure> stateNotifier = StateNotifier(stateStructure);
}
添加监听器并发布状态
最后,可以添加监听器并发布状态:
class ExampleForStateNotifier {
/// 添加监听器
static void stateNotifier$addListener() {
PublicAccess.stateNotifier.addListener(listener);
}
/// 移除监听器
static void stateNotifier$removeListener() {
PublicAccess.stateNotifier.removeListener(listener);
}
/// 发布状态
static void startNotifier() {
Timer.periodic(Duration(seconds: 5), (timer) {
PublicAccess.stateNotifier.notify(); // 发布状态
// 共享数据
PublicAccess.stateNotifier.addValue('myKey', timer.tick);
// 发布状态和数据
PublicAccess.stateNotifier.notify(states: {StateList.ok}, data: 'any data');
});
}
/// 状态监听器
static void listener(StateNotifier notifier, {dynamic data}) {
if (notifier.states.hasState(StateList.ok)) {
final tick = notifier.getValue('myKey');
// 更新状态结构
(notifier as StateStructure).isInRequest = true;
}
}
}
完整示例 Demo
以下是一个完整的示例,展示了如何结合以上功能:
import 'dart:async';
void main() {
// 初始化数据通知器
ExampleForDataNotifier.dataNotifier$addListener();
ExampleForDataNotifier.startNotifier();
// 初始化事件通知器
ExampleForEventNotifier.eventNotifier$addListener();
ExampleForEventNotifier.startNotifier();
// 初始化状态通知器
ExampleForStateNotifier.stateNotifier$addListener();
ExampleForStateNotifier.startNotifier();
}
更多关于Flutter通知管理插件iris_notifier的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter通知管理插件iris_notifier的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
iris_notifier 是 Flutter 中用于管理通知的一个插件。它提供了一种简单的方式来发送和接收通知,适用于需要在不同组件或页面之间传递消息的场景。以下是如何使用 iris_notifier 的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml 文件中添加 iris_notifier 的依赖:
dependencies:
flutter:
sdk: flutter
iris_notifier: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get 来安装依赖。
2. 初始化 Notifier
在你的应用程序的 main.dart 文件中,初始化 IrisNotifier:
import 'package:flutter/material.dart';
import 'package:iris_notifier/iris_notifier.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Iris Notifier Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomeScreen(),
);
}
}
3. 发送通知
在需要发送通知的地方,使用 IrisNotifier.instance.notify 方法来发送通知:
import 'package:flutter/material.dart';
import 'package:iris_notifier/iris_notifier.dart';
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
IrisNotifier.instance.notify('my_event', data: 'Hello from HomeScreen!');
},
child: Text('Send Notification'),
),
),
);
}
}
4. 接收通知
在需要接收通知的地方,使用 IrisNotifier.instance.on 方法来监听通知:
import 'package:flutter/material.dart';
import 'package:iris_notifier/iris_notifier.dart';
class AnotherScreen extends StatefulWidget {
@override
_AnotherScreenState createState() => _AnotherScreenState();
}
class _AnotherScreenState extends State<AnotherScreen> {
String _message = '';
@override
void initState() {
super.initState();
IrisNotifier.instance.on('my_event', (data) {
setState(() {
_message = data;
});
});
}
@override
void dispose() {
IrisNotifier.instance.off('my_event');
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Another Screen'),
),
body: Center(
child: Text(_message),
),
);
}
}
5. 取消监听
为了避免内存泄漏,记得在 dispose 方法中取消监听:
@override
void dispose() {
IrisNotifier.instance.off('my_event');
super.dispose();
}
6. 处理多个通知
你可以监听多个事件,并根据不同的事件类型执行不同的操作:
IrisNotifier.instance.on('event1', (data) {
// 处理 event1
});
IrisNotifier.instance.on('event2', (data) {
// 处理 event2
});
7. 发送通知时传递数据
你可以在发送通知时传递任意类型的数据:
IrisNotifier.instance.notify('my_event', data: {'key': 'value'});
然后在接收通知时处理这些数据:
IrisNotifier.instance.on('my_event', (data) {
print(data['key']); // 输出: value
});

