美文网首页
Flutter 实现广播通知

Flutter 实现广播通知

作者: AbnerZhang | 来源:发表于2021-12-29 09:45 被阅读0次

首先感谢https://www.jianshu.com/p/4e7483e6dc6e的作者提供的思路。

总结下来就是通过单例实现消息的保存添加,发送的功能,依据上面文章提供的思路,结合本人在做iOS开发时用到的通知中心的思想,首先指出问题:

    1. addNotification的时候是保存方法,以供后面postNotification的时候进行实现,但是,根据上面的例子,第一个页面和第二个页面分别添加广播通知,在第三个页面发送广播通知的时候,相当于第一个页面和第二个页面一共执行了两个方法,因此下面的评论说在add添加方法时用map保存,但是通过下面代码

Map<String, GetObject> getObject = Map<String, GetObject>();

//添加监听者方法

addObserver(String postName, object(dynamic object)) {

postNameMap[postName] = null;

getObject[postName] = object;

}

这里面getObject保存add的方法,可以看到getObject[postName] = object; 每个postName的方法只能保存一个,但是上面的栗子,第一个和第二个页面分别添加了同一个postName的方法,而这样添加后只保存了最后添加的方法,之前添加同名的方法会被丢弃。

    2. 因为上面add保存的时候只保存了最后添加的方法,之前添加的方法会被丢弃,因此在下面代码执行的时候

//发送通知传值

postNotification(String postName, dynamic object) {

//检索Map是否含有postName

if (postNameMap.containsKey(postName)) {

postNameMap[postName] = object;

// = object;

getObject[postName](postNameMap[postName]);

}

}

代码getObject[postName](postNameMap[postName]);只执行了一个方法。

通过上面分析,修改关键代码,

typedef NotificationUsingBlock = Function({dynamic object});

class NotificationManager {

  NotificationManager._getInstance();

  static final NotificationManager _instance =

      NotificationManager._getInstance();

  static NotificationManager get instance {

    return _instance;

  }

  /// 存储所有的通知信息

  // final Map<String, dynamic> _notificationInfo = <String, dynamic>{};

  /// 存储所有的通知回调

  final Map<String, List<NotificationUsingBlock>> _notificationBlock =

      <String, List<NotificationUsingBlock>>{};

  /// 添加通知

  /// name:通知名称

  /// using:通知内容回调

  addNotification(String name, NotificationUsingBlock usingBlock) {

    final List<NotificationUsingBlock> list = [];

    if (_notificationBlock.containsKey(name)) {

      list.addAll(_notificationBlock[name]!);

    }

    list.add(usingBlock);

    _notificationBlock[name] = list;

  }

  /// 发送通知

  /// name:通知名称

  /// object:通知内容

  postNotification(String name, {dynamic object}) {

    if (_notificationBlock.containsKey(name)) {

      for (var block in _notificationBlock[name]!) {

        block(object: object);

      }

    }

  }

  /// 删除指定通知

  /// name:通知名称

  removeNotification(String name) {

    if (_notificationBlock.containsKey(name)) {

      var list = _notificationBlock[name];

      if (list!.length == 1) {

        _notificationBlock.remove(name);

      } else {

        list.removeLast();

        _notificationBlock[name] = list;

      }

    }

  }

}

可以看到,关键代码, 容器_notificationBlock根据name的不同, 保存了多个方法在List<NotificationUsingBlock>中,在postNotification的时候根据name查询这个list保存的方法后执行,移除通知的时候,也是通过name移除对应的list。

留下的问题:在iOS开发时,可以在dealloc中一句代码实现移除多个通知    [[NSNotificationCenter defaultCenter] removeObserver:self];,但是在这里我还没想好如何实现该效果。

时间紧迫,难免有很多问题,新手欢迎指正。

相关文章

  • Flutter 实现广播通知

    首先感谢https://www.jianshu.com/p/4e7483e6dc6e[https://www.ji...

  • Flutter 广播 / 通知传值

    创建通知管理类 使用

  • flutter广播EventBus

    在flutter本身没有提供类似于android的广播通信机制。要想实现广播刷新页面,我们可以使用强大的Event...

  • iOS--本地通知与远程推送

    一、苹果中的几种通知 1、广播通知(NSNotificationCenter) 1)实现一个对象对多个对象的通信 ...

  • Flutter使用Stream进行消息通知

    在Android中我们用广播,eventBus等方式来实现监听与消息传递。Flutter中我们用流(Stream)...

  • Flutter单例模式

    借用Flutter事件总线的例子: 8.3 事件总线 在APP中,我们经常会需要一个广播机制,用以跨页面事件通知,...

  • NSNotification通知的使用和多线程

    通知的使用 NSNotificationCenter通知中心是iOS程序内部的一种消息广播的实现机制,可以在不同对...

  • iOS NSNotificationCenter Appdele

    通知的使用 NSNotificationCenter通知中心是iOS程序内部的一种消息广播的实现机制,可以在不同对...

  • oc之通知模式

    通知 iOS中的通知一般分为广播通知,本地通知和离线通知。我们这里说的就只是广播通知。 关于广播通知的理解我这里就...

  • Broadcast广播机制

    一、概述 Broadcast机制的作用主要是为了实现事情一处发生,多处得到通知的效果。广播分为广播发送和广播接收两...

网友评论

      本文标题:Flutter 实现广播通知

      本文链接:https://www.haomeiwen.com/subject/whhvqrtx.html