美文网首页Flutter
flutter 单例的写法, dio的封装

flutter 单例的写法, dio的封装

作者: 微风_10a5 | 来源:发表于2021-11-16 14:06 被阅读0次

    直接进入正题

    单例的标准写法:

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

    相关文章

      网友评论

        本文标题:flutter 单例的写法, dio的封装

        本文链接:https://www.haomeiwen.com/subject/fyjhtrtx.html