单例模式
我们通常的开发中,单例模式经常会用到,在Dart中亦同样。
代码:
class Singleton{
// static _instance,_instance会在编译期被初始化,保证了只被创建一次
static final Singleton _instance = Singleton._internal();
//提供了一个工厂方法来获取该类的实例
factory Singleton(){
return _instance;
}
// 通过私有方法_internal()隐藏了构造方法,防止被误创建
Singleton._internal(){
// 初始化
init();
}
// Singleton._internal(); // 不需要初始化
void init(){
print("这里初始化");
}
}
运行验证:
Singleton s1 = Singleton();
Singleton s2 = Singleton();
Singleton s3 = Singleton._instance; // _instance私有方法,一般不这样的创建
print(identical(s1, s2)); // 运行结果:true
print(identical(s1, s3)); // 运行结果:true
print(s1 == s2); // 运行结果:true
print(s1 == s3); // 运行结果:true
可知该类只会被创建一次,也只占用一次内存。
实际在阅读有些库的源码会发现另一种写法,可能看起来更直观、更容易理解。
// 另一种写法:
class Singleton{
factory Singleton() => _getInstance();
static Singleton get instance => _getInstance();
static Singleton _instance;
Singleton._internal();
static Singleton _getInstance(){
if(_instance == null){
_instance = Singleton._internal();
}
return _instance;
}
}
Dio封装
简单使用单例对Dio进行封装
封装代码:
class RCHttpUtil{
// 单例模式
static final RCHttpUtil _instance = RCHttpUtil._internal();
factory RCHttpUtil() => _instance;
RCHttpUtil._internal(){
init();
}
Dio _dio;
// 初始化请求配置
init(){
BaseOptions baseOptions = BaseOptions(
baseUrl: "https://www.xxxx/api",
connectTimeout: 5000,
);
_dio = Dio(baseOptions);
}
// 请求(默认post)
Future rc_requset(String url,{String method = "post",Map<String,dynamic> params}) async{
Options options = Options(method: method);
try{
final result = await _dio.request(url,queryParameters: params,options: options);
return result;
} on DioError catch(error){
throw error;
}
}
}
使用:
RCHttpUtil().rc_requset("/xxx",params: {"xxx":"xxx"}).then((result){
print(result);
}).catchError((error){
print("请求失败!");
});
笔者只是做一个简单的封装,开发者可以自行按照自己的需求封装,比如对错误码的处理等。
网友评论