Flutter 实现广播通知

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

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

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

Map getObject = Map();

//添加监听者方法

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 _notificationInfo = {};

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

  final Map> _notificationBlock =

      >{};

  /// 添加通知

  /// name:通知名称

  /// using:通知内容回调

  addNotification(String name, NotificationUsingBlock usingBlock) {

    final List 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中,在postNotification的时候根据name查询这个list保存的方法后执行,移除通知的时候,也是通过name移除对应的list。

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

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

你可能感兴趣的:(Flutter 实现广播通知)