Flutter程序员

Flutter单例模式及Dio的封装

2021-01-07  本文已影响0人  HuyaRC

单例模式

我们通常的开发中,单例模式经常会用到,在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("请求失败!");
});

笔者只是做一个简单的封装,开发者可以自行按照自己的需求封装,比如对错误码的处理等。


个人浅见,有误的地方欢迎指正

上一篇下一篇

猜你喜欢

热点阅读