Flutter

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的文章。如果有疑问的话,请在下方留言~

上一篇下一篇

猜你喜欢

热点阅读