flutter开发实战-Release环境与Debug调试环境配置实现
在开发中,我们经常遇到Release与Debug相关请求等配置隔离。这里记录之前的实现方案。
 在实现之前,我们需要先看下git_it
一、get_it
在开发过程中,需要App的部分逻辑与Widget分离。git_it和provider都可以用作状态管理,这里使用的是git_it,我使用git_it缘由就是获取时不强制依赖context。
GetIt是一个用于 Dart 和 Flutter 项目的简单服务定位器,其中包含一些受到 Splat 启发的附加功能。 它可以用来代替 InheritedWidget 或 Provider 比如从你的用户界面来访问对象。
1.1 引入git_it
pubspec.yaml引入git_it
get_it: ^7.6.0
1.2 使用git_it
GetIt getIt = GetIt.instance;
// 或者
GetIt getIt = GetIt.I;
//重新自定义一个新的
GetIt getIt = GetIt.asNewInstance();
注册
GetIt gitIt = GetIt.instance;
//在GetIt里注册工厂类TokenFetcher
gitIt.registerFactory<TokenFetcher>(() => TokenFetcherImpl());
调用获取
var tokenFetcher = gitIt.get<TokenFetcher>();
这里简单介绍使用方式,Release与Debug相关请求需要用到git_it。
二、实现Config
Release与Debug相关请求配置进行区分,我们需要实现一个CongfigManager
/// 定义config配置的key常量
class ConfigConstant {
  static String kAppHost = "appHost";
}
// 定义枚举,网络请求环境,DEV、PRE、PRO
enum ConfigEnv {
  dev, // Dev服务器环境
  pre, // Pre服务器环境 预发布环境
  pro, // Pre服务器环境 线上生产环境
}
/// 管理网络请求相关服务
abstract class ConfigManager extends ChangeNotifier {
  void init();
  String get(String key);
  int getImAppId();
}
2.1、实现Release的配置ReleaseConfigMgr
实现Release环境的ConfigManager
class ReleaseConfigMgr extends ConfigManager {
  ReleaseConfigMgr() {
    init();
  }
  
  String get(String key) {
    // 根据key获取请求的服务地址
    // TODO: implement get
    if (ConfigConstant. kAppHost == key) {
      return "https://app-s.ifour.cn/";
    }
    return "";
  }
  
  void init() {
    // TODO: implement init
  }
  
  int getImAppId() {
    // TODO: implement getImAppId
    return 111111111;
  }
}
2.2、实现Debug的配置DebugConfigMgr
实现Debug的配置DebugConfigMgr
class DebugConfigMgr extends ConfigManager {
  ConfigEnv _env = ConfigEnv.dev;
  DebugConfigMgr() {
    init();
  }
  
  String get(String key) {
    // TODO: implement get
    if (ConfigEnv.dev == _env) {
      if (ConfigConstant. kAppHost == key) {
         return "https://app-dev.ifour.cn/";
      }
    } else if (ConfigEnv.pre == _env) {
      if (ConfigConstant. kAppHost == key) {
         return "https://app-pre.ifour.cn/";
      }
    } else if (ConfigEnv.pro == _env) {
      if (ConfigConstant. kAppHost == key) {
         return "https://app-s.ifour.cn/";
      }
    }
    return "";
  }
  
  int getImAppId() {
    // TODO: implement getImAppId
    // 从本地取出相应的保存环境类型
    if (ConfigEnv.dev == _env) {
      /// IM sdk appId  Dev环境
      return 111111111;
    } else if (ConfigEnv.pre == _env) {
      /// IM sdk appId  Pre环境
      return 111111112;
    } else if (ConfigEnv.pro == _env) {
      /// IM sdk appId  Pro环境
      return 111111113;
    }
    return 0;
  }
  
  void init() {
    // TODO: implement init
    // 初始化的时候从本地取出
  }
  // 设置环境
  setEnv(ConfigEnv env) {
    // TODO: implement setEnv
    _env = env;
    // 更新本地存储的环境类型
    notifyListeners();
  }
}
三、使用get_it设置Release、debug对应的config
使用get_it设置Release、debug对应的config。
 由于我们debug与release配置不同,我这里使用的是main.dart与main_debug.dart表示不同的入口
3.1、在main.dart配置
// release
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Global.init().then((e) {
    OnePlatform.app = () => const MyApp();
  });
  // 设置请求地址及IM
  GetIt.instance.registerSingleton<ConfigManager>(ReleaseConfigMgr(),
      signalsReady: true);
  // 初始化IM配置
  IMManager().configIM(imSDKAppId: GetIt.instance<ConfigManager>().getImAppId());
}
3.2、在main_debug.dart配置
// debug
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Global.init().then((e) {
    OnePlatform.app = () => const MyApp();
  });
  // 设置请求地址及IM
  GetIt.instance.registerSingleton<ConfigManager>(debugConfigMgr,
      signalsReady: true);
  // 初始化IM配置
  IMManager().configIM(imSDKAppId: GetIt.instance<ConfigManager>().getImAppId());
}
3.3、代码中具体使用获取请求地址
代码中具体使用获取请求地址,可以直接使用GetIt.instance().get(ConfigConstant.kAppHost)获取请求服务器地址
String requestUrl = GetIt.instance().get(ConfigConstant.kAppHost) + url;
具体请求就可以使用
static Future<ResponseData?> getAppInfo(String url, {required AppInfoReq req}) async {
    Map<String, dynamic>? params;
    if (req != null) {
      params = req.toJson();
    }
    String requestUrl = GetIt.instance<ConfigManager>().get(ConfigConstant.kAppHost) + url;
    return await SDHttp.getInstance().get(requestUrl, params: params);
  }
四、小结
flutter开发实战-Release环境与Debug调试环境配置实现,使用的是GetIt进行配置,不同环境实现不同的config配置即可,比如release请求地址固定的,如果是debug可以切换开发环境来处理更多额外的操作。
学习记录,每天不停进步。


