Flutter开发 - 单例的使用,教你如何玩转单例,全局传参,根据环境传参

408 阅读3分钟

单例在各个开发平台都有使用的场景,可以用于定义一些全局的参数和保存生命周期内的一些数据。那么在Flutter中单例该怎么使用呢?博主百度了下,找到的大多数都是类似这样的写法:

class Manager {
  // 工厂模式
  factory Manager() =>_getInstance()
  static Manager get instance => _getInstance();
  static Manager _instance;
  Manager._internal() {
    // 初始化
  }
  static Manager _getInstance() {
    if (_instance == null) {
      _instance = new Manager._internal();
    }
    return _instance;
  }
}

对于初学者而言,看完之后,你知道该怎么定义参数么?反正博主初学时看的是一脸懵,根本不知道怎么定义参数,怎么取值。

接下来,博主来带大家了解下单例的使用和其他的扩展使用,能满足绝大多数情况下的需要。
首先贴上代码,不多,大家先看下:


abstract class _Glb {
  ///appKey
  String get appKey;

  ///位置信息
  String get location;

  ///用户昵称
  String get userName;

  /// 用户id
  String get userID;

  ///域名地址
  String get baseURL;
}

class Glb extends _Glb {
  _Glb proxy;

  ///根据配置区分下不同环境
  Glb._internal() {
    if (1 == 1) {
      proxy = _TestGlb();
    } else if (1 == 1) {
      proxy = _DevGlb();
    } else if (1 == 1) {
      proxy = _ProGlb();
    } else {
      proxy = _DefaultGlb();
    }
  }

  static Glb _singleton = Glb._internal();

  factory Glb() => _singleton;

  @override
  String get appKey => proxy.appKey;

  @override
  String get location => proxy.location;

  @override
  String get userName => proxy.userName;

  @override
  String get userID => proxy.userID;

  @override
  String get baseURL => proxy.baseURL;
}

class _DefaultGlb extends _Glb {
  @override
  String get appKey => "默认Appkey";

  @override
  String get location => "默认地址";

  @override
  String get userName => "默认昵称";

  @override
  String get userID => "默认用户ID";

  @override
  String get baseURL => "默认URL";
}

///生产环境参数
class _ProGlb extends _DefaultGlb {
  @override
  String get baseURL {
    ///根据环境获取对应的baseURL
    return 'xxxxxx';
  }

  @override
  String get appKey {
    ///根据环境获取对应的appKey
    return 'xxxxxxx';
  }
}

///开发服参数
class _DevGlb extends _DefaultGlb {
  @override
  String get baseURL {
    ///根据环境获取对应的baseURL
    return 'xxxxxx';
  }

  @override
  String get appKey {
    ///根据环境获取对应的appKey
    return 'xxxxxxx';
  }
}

///测试服参数
class _TestGlb extends _DefaultGlb {
  @override
  String get appKey {
    ///根据环境获取对应的appKey
    return 'xxxxxxx';
  }

  @override
  String get location => "xx";

  @override
  String get userName {
    return 'CodingFire';
  }

  @override
  String get userID {
    return '0001';
  }

  @override
  String get baseURL {
    ///根据环境获取对应的baseURL
    return 'xxxxxx';
  }
}

仔细看,你会发现和顶部贴的代码有相似之处,是的,都是单例的声明和初始化,但是顶部的代码中没有教大家怎么定义参数,怎么使用参数。下面,博主简单说下这里的结构:

  • abstract抽象方法修饰的方法,用于让其他方法来继承(abstract不做过多介绍,可以自行了解下),继承后其他方法便有了这些参数;
abstract class _Glb {
  ///appKey
  String get appKey;

  ///位置信息
  String get location;

  ///用户昵称
  String get userName;

  /// 用户id
  String get userID;

  ///域名地址
  String get baseURL;
}
  • 单例的初始化,大同小异,这里可以根据环境变量来区分不同的环境,同时这里要实现抽象方法中的get方法,否则会报错。
class Glb extends _Glb {
  _Glb proxy;

  ///根据配置区分下不同环境
  Glb._internal() {
    if (1 == 1) {
      proxy = _TestGlb();
    } else if (1 == 1) {
      proxy = _DevGlb();
    } else if (1 == 1) {
      proxy = _ProGlb();
    } else {
      proxy = _DefaultGlb();
    }
  }

  static Glb _singleton = Glb._internal();

  factory Glb() => _singleton;

  @override
  String get appKey => proxy.appKey;

  @override
  String get location => proxy.location;

  @override
  String get userName => proxy.userName;

  @override
  String get userID => proxy.userID;

  @override
  String get baseURL => proxy.baseURL;
}
  • 接下来是一个继承Glb的默认配置参数方法:
class _DefaultGlb extends _Glb {
  @override
  String get appKey => "默认Appkey";

  @override
  String get location => "默认地址";

  @override
  String get userName => "默认昵称";

  @override
  String get userID => "默认用户ID";

  @override
  String get baseURL => "默认URL";
}
  • 然后让其他环境的配置参数都继承于默认的方法,防止数据为空的情况,继承后,只要实现了对应的get方法,return了参数,就会使用对应配置中return的参数:
///生产环境参数
class _ProGlb extends _DefaultGlb {
  @override
  String get baseURL {
    ///根据环境获取对应的baseURL
    return 'xxxxxx';
  }

  @override
  String get appKey {
    ///根据环境获取对应的appKey
    return 'xxxxxxx';
  }
}

///开发服参数
class _DevGlb extends _DefaultGlb {
  @override
  String get baseURL {
    ///根据环境获取对应的baseURL
    return 'xxxxxx';
  }

  @override
  String get appKey {
    ///根据环境获取对应的appKey
    return 'xxxxxxx';
  }
}

///测试服参数
class _TestGlb extends _DefaultGlb {
  @override
  String get appKey {
    ///根据环境获取对应的appKey
    return 'xxxxxxx';
  }

  @override
  String get location => "xx";

  @override
  String get userName {
    return 'CodingFire';
  }

  @override
  String get userID {
    return '0001';
  }

  @override
  String get baseURL {
    ///根据环境获取对应的baseURL
    return 'xxxxxx';
  }
  • 关于取值,怎么用?
    昨天博主另一篇关于布局的博客中就使用到了,再贴一下:
///比如使用userName,需要先引入这个文件
Glb().userName

你学会了么?快去试试吧!
Demo下载地址