flutter 单例的写法, dio的封装
2021-11-16 本文已影响0人
微风_10a5
直接进入正题
单例的标准写法:
新建一个NetworkTool工具类,下面是适配了Dart空安全的写法
class NetworkTool {
// 工厂模式
factory NetworkTool() => _getInstance()!;
static NetworkTool? get instance => _getInstance();
static NetworkTool? _instance;
NetworkTool._internal() {
// 初始化
print("可以做初始化操作");
}
static NetworkTool? _getInstance() {
if (_instance == null) {
_instance = NetworkTool._internal();
}
return _instance;
}
static void uploadTask(){
print("uploadTask");
}
static void downLoadTask(){
print("downLoadTask");
}
void downImages(){
print("downImages");
}
}
接下来我们来测试一下,是不是同个实例,用 identical(Object a, Object b)
,如果a和b是同一个实例,则会返回true,否则返回false;
void main() {
bool result2 = identical(Text(""), Text(""));
print("text result2:$result2");
bool result = identical(NetworkTool.instance, NetworkTool());
print("singleton result:$result");
if (NetworkTool.instance == NetworkTool()) {
print("===========");
NetworkTool.downLoadTask();
NetworkTool.instance?.downImages();
NetworkTool().downImages();
}
runApp(MyApp());
}
结果如下:
image.png
可以看出来,我们单例的写法没有什么问题,不管是调用getter方法NetworkTool.instance
,还是调用工厂构造方法NetworkTool()
,创建出来的实例都是同一个。
单例实战
我们来封装一下Dio这个http请求库,只作简单的演示
class HttpUtil {
// 单例模式
static HttpUtil? _instance;
factory HttpUtil() => _getInstance()!;
static HttpUtil? get instance => _getInstance();
static HttpUtil? _getInstance() {
if (_instance == null) {
_instance = HttpUtil._internal();
}
return _instance;
}
HttpUtil._internal() {
init();
}
late 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;
}
}
}
外面的使用如下:
void main() {
HttpUtil.instance?.rc_requset("www.bai.com");
HttpUtil().rc_requset("www.bai.com");
bool re = identical(HttpUtil.instance, HttpUtil());
print("singleton result= $re");
runApp(MyApp());
}
结果当然也是返回true;
单例的其他写法
class RCHttpUtil {
// 单例模式
static final RCHttpUtil _instance = RCHttpUtil._internal();
factory RCHttpUtil() => _instance;
static RCHttpUtil get instance => RCHttpUtil._internal();
RCHttpUtil._internal() {
init();
}
late 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;
}
}
}
使用如下:
void main() {
RCHttpUtil.instance.rc_requset("www.jd.com");
RCHttpUtil().rc_requset("www.baidu.com");
runApp(MyApp());
}
结尾
希望看完此文章后,小伙伴们自己可以写出单例出来, 至少见到其他人的单例写法,心里不慌,完全看得懂,hold得住!
小伙伴们,今天的分享至此结束! 如果小伴们,觉得有点用的话,或者已经看到这里面来的请加关注及点个赞吧~~ 后续会分享更多有关flutter的文章。如果有疑问的话,请在下方留言~