本文最后更新于:3 个月前
一、几个知识点
- 当使用
factory
关键词修饰构造函数时,这个构造函数不会创建类的实例
- 使用
new
语句来构造一个类,构造函数的名字可能是ClassName
,也可以是ClassName.otherName
,关键字new
可以省略
Dart
没有关键字public
、protected
和private
,如果标识符以下划线_
开头,则它相对于库是私有的,每个.dart
文件都是一个库
二、代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class SingletonClass { String params1;
static SingletonClass _instance; factory SingletonClass() { return SingletonClass.sharedInstance(); } SingletonClass._init(); factory SingletonClass.sharedInstance() { if (_instance == null) { _instance = SingletonClass._init(); _instance.params1 = '1'; } return _instance; } }
|
说明:
- 单例需要在整个
APP
内存中保持只被创建一次,所以需要使用静态变量
- 为了标识某个类为单例类,增加可读性,所以建议使用统一格式或者统一关键字的有名构造函数,无名构造函数可以不提供
- 提供私有构造函数来初始化实例对象,防止其他库直接访问该初始化方法
三、使用单例进行通知
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| typedef void NotiCallback<T>(params);
class EventBus { static EventBus _instance; factory EventBus() { return EventBus.sharedInstance(); } EventBus._init(); factory EventBus.sharedInstance() { if (_instance == null) { _instance = EventBus._init(); } return _instance; }
Map<String, NotiCallback> _notiMap = Map();
void add<String, NotiCallback>(eventName, callback) { if (eventName == null) { return; } if (eventName.length == 0) { return; } _notiMap[eventName] = callback; } void remove<String, NotiCallback>(eventName, callback) { if (eventName == null) { return; } if (eventName.length == 0) { return; } _notiMap[eventName] = null; } void emit<String, T>(eventName, params) { if (eventName == null) { return; } if (eventName.length == 0) { return; } NotiCallback callback = _notiMap[eventName]; callback(params); } }
|
使用callback
进行传参,在单例中一对一保存callback
,如果是一对多的场景,可在单例中保存list
数据