首先感谢https://www.jianshu.com/p/4e7483e6dc6e的作者提供的思路。
总结下来就是通过单例实现消息的保存添加,发送的功能,依据上面文章提供的思路,结合本人在做iOS开发时用到的通知中心的思想,首先指出问题:
1. addNotification的时候是保存方法,以供后面postNotification的时候进行实现,但是,根据上面的例子,第一个页面和第二个页面分别添加广播通知,在第三个页面发送广播通知的时候,相当于第一个页面和第二个页面一共执行了两个方法,因此下面的评论说在add添加方法时用map保存,但是通过下面代码
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
/// 存储所有的通知回调
final Map
/// 添加通知
/// name:通知名称
/// using:通知内容回调
addNotification(String name, NotificationUsingBlock usingBlock) {
final 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
留下的问题:在iOS开发时,可以在dealloc中一句代码实现移除多个通知 [[NSNotificationCenter defaultCenter] removeObserver:self];,但是在这里我还没想好如何实现该效果。
时间紧迫,难免有很多问题,新手欢迎指正。