美文网首页Flutter程序员
Flutter单例模式及Dio的封装

Flutter单例模式及Dio的封装

作者: HuyaRC | 来源:发表于2021-01-07 17:44 被阅读0次

    单例模式

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

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


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

    相关文章

      网友评论

        本文标题:Flutter单例模式及Dio的封装

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