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

1 回复

更多关于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
});
回到顶部