单例在各个开发平台都有使用的场景,可以用于定义一些全局的参数和保存生命周期内的一些数据。那么在Flutter中单例该怎么使用呢?博主百度了下,找到的大多数都是类似这样的写法:
class Manager {
// 工厂模式
factory Manager() =>_getInstance()
static Manager get instance => _getInstance();
static Manager _instance;
Manager._internal() {
// 初始化
}
static Manager _getInstance() {
if (_instance == null) {
_instance = new Manager._internal();
}
return _instance;
}
}
对于初学者而言,看完之后,你知道该怎么定义参数么?反正博主初学时看的是一脸懵,根本不知道怎么定义参数,怎么取值。
接下来,博主来带大家了解下单例的使用和其他的扩展使用,能满足绝大多数情况下的需要。
首先贴上代码,不多,大家先看下:
abstract class _Glb {
///appKey
String get appKey;
///位置信息
String get location;
///用户昵称
String get userName;
/// 用户id
String get userID;
///域名地址
String get baseURL;
}
class Glb extends _Glb {
_Glb proxy;
///根据配置区分下不同环境
Glb._internal() {
if (1 == 1) {
proxy = _TestGlb();
} else if (1 == 1) {
proxy = _DevGlb();
} else if (1 == 1) {
proxy = _ProGlb();
} else {
proxy = _DefaultGlb();
}
}
static Glb _singleton = Glb._internal();
factory Glb() => _singleton;
@override
String get appKey => proxy.appKey;
@override
String get location => proxy.location;
@override
String get userName => proxy.userName;
@override
String get userID => proxy.userID;
@override
String get baseURL => proxy.baseURL;
}
class _DefaultGlb extends _Glb {
@override
String get appKey => "默认Appkey";
@override
String get location => "默认地址";
@override
String get userName => "默认昵称";
@override
String get userID => "默认用户ID";
@override
String get baseURL => "默认URL";
}
///生产环境参数
class _ProGlb extends _DefaultGlb {
@override
String get baseURL {
///根据环境获取对应的baseURL
return 'xxxxxx';
}
@override
String get appKey {
///根据环境获取对应的appKey
return 'xxxxxxx';
}
}
///开发服参数
class _DevGlb extends _DefaultGlb {
@override
String get baseURL {
///根据环境获取对应的baseURL
return 'xxxxxx';
}
@override
String get appKey {
///根据环境获取对应的appKey
return 'xxxxxxx';
}
}
///测试服参数
class _TestGlb extends _DefaultGlb {
@override
String get appKey {
///根据环境获取对应的appKey
return 'xxxxxxx';
}
@override
String get location => "xx";
@override
String get userName {
return 'CodingFire';
}
@override
String get userID {
return '0001';
}
@override
String get baseURL {
///根据环境获取对应的baseURL
return 'xxxxxx';
}
}
仔细看,你会发现和顶部贴的代码有相似之处,是的,都是单例的声明和初始化,但是顶部的代码中没有教大家怎么定义参数,怎么使用参数。下面,博主简单说下这里的结构:
- abstract抽象方法修饰的方法,用于让其他方法来继承(abstract不做过多介绍,可以自行了解下),继承后其他方法便有了这些参数;
abstract class _Glb {
///appKey
String get appKey;
///位置信息
String get location;
///用户昵称
String get userName;
/// 用户id
String get userID;
///域名地址
String get baseURL;
}
- 单例的初始化,大同小异,这里可以根据环境变量来区分不同的环境,同时这里要实现抽象方法中的get方法,否则会报错。
class Glb extends _Glb {
_Glb proxy;
///根据配置区分下不同环境
Glb._internal() {
if (1 == 1) {
proxy = _TestGlb();
} else if (1 == 1) {
proxy = _DevGlb();
} else if (1 == 1) {
proxy = _ProGlb();
} else {
proxy = _DefaultGlb();
}
}
static Glb _singleton = Glb._internal();
factory Glb() => _singleton;
@override
String get appKey => proxy.appKey;
@override
String get location => proxy.location;
@override
String get userName => proxy.userName;
@override
String get userID => proxy.userID;
@override
String get baseURL => proxy.baseURL;
}
- 接下来是一个继承Glb的默认配置参数方法:
class _DefaultGlb extends _Glb {
@override
String get appKey => "默认Appkey";
@override
String get location => "默认地址";
@override
String get userName => "默认昵称";
@override
String get userID => "默认用户ID";
@override
String get baseURL => "默认URL";
}
- 然后让其他环境的配置参数都继承于默认的方法,防止数据为空的情况,继承后,只要实现了对应的get方法,return了参数,就会使用对应配置中return的参数:
///生产环境参数
class _ProGlb extends _DefaultGlb {
@override
String get baseURL {
///根据环境获取对应的baseURL
return 'xxxxxx';
}
@override
String get appKey {
///根据环境获取对应的appKey
return 'xxxxxxx';
}
}
///开发服参数
class _DevGlb extends _DefaultGlb {
@override
String get baseURL {
///根据环境获取对应的baseURL
return 'xxxxxx';
}
@override
String get appKey {
///根据环境获取对应的appKey
return 'xxxxxxx';
}
}
///测试服参数
class _TestGlb extends _DefaultGlb {
@override
String get appKey {
///根据环境获取对应的appKey
return 'xxxxxxx';
}
@override
String get location => "xx";
@override
String get userName {
return 'CodingFire';
}
@override
String get userID {
return '0001';
}
@override
String get baseURL {
///根据环境获取对应的baseURL
return 'xxxxxx';
}
- 关于取值,怎么用?
昨天博主另一篇关于布局的博客中就使用到了,再贴一下:
///比如使用userName,需要先引入这个文件
Glb().userName
你学会了么?快去试试吧!
Demo下载地址