flutter開(kāi)發(fā)實(shí)戰(zhàn)-Release環(huán)境與Debug調(diào)試環(huán)境配置實(shí)現(xiàn)
在開(kāi)發(fā)中,我們經(jīng)常遇到Release與Debug相關(guān)請(qǐng)求等配置隔離。這里記錄之前的實(shí)現(xiàn)方案。
在實(shí)現(xiàn)之前,我們需要先看下git_it
一、get_it
在開(kāi)發(fā)過(guò)程中,需要App的部分邏輯與Widget分離。git_it和provider都可以用作狀態(tài)管理,這里使用的是git_it,我使用git_it緣由就是獲取時(shí)不強(qiáng)制依賴context。
GetIt是一個(gè)用于 Dart 和 Flutter 項(xiàng)目的簡(jiǎn)單服務(wù)定位器,其中包含一些受到 Splat 啟發(fā)的附加功能。 它可以用來(lái)代替 InheritedWidget 或 Provider 比如從你的用戶界面來(lái)訪問(wèn)對(duì)象。
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;
//重新自定義一個(gè)新的
GetIt getIt = GetIt.asNewInstance();
注冊(cè)
GetIt gitIt = GetIt.instance;
//在GetIt里注冊(cè)工廠類(lèi)TokenFetcher
gitIt.registerFactory<TokenFetcher>(() => TokenFetcherImpl());
調(diào)用獲取
var tokenFetcher = gitIt.get<TokenFetcher>();
這里簡(jiǎn)單介紹使用方式,Release與Debug相關(guān)請(qǐng)求需要用到git_it。
二、實(shí)現(xiàn)Config
Release與Debug相關(guān)請(qǐng)求配置進(jìn)行區(qū)分,我們需要實(shí)現(xiàn)一個(gè)CongfigManager
/// 定義config配置的key常量
class ConfigConstant {
static String kAppHost = "appHost";
}
// 定義枚舉,網(wǎng)絡(luò)請(qǐng)求環(huán)境,DEV、PRE、PRO
enum ConfigEnv {
dev, // Dev服務(wù)器環(huán)境
pre, // Pre服務(wù)器環(huán)境 預(yù)發(fā)布環(huán)境
pro, // Pre服務(wù)器環(huán)境 線上生產(chǎn)環(huán)境
}
/// 管理網(wǎng)絡(luò)請(qǐng)求相關(guān)服務(wù)
abstract class ConfigManager extends ChangeNotifier {
void init();
String get(String key);
int getImAppId();
}
2.1、實(shí)現(xiàn)Release的配置ReleaseConfigMgr
實(shí)現(xiàn)Release環(huán)境的ConfigManager
class ReleaseConfigMgr extends ConfigManager {
ReleaseConfigMgr() {
init();
}
String get(String key) {
// 根據(jù)key獲取請(qǐng)求的服務(wù)地址
// 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、實(shí)現(xiàn)Debug的配置DebugConfigMgr
實(shí)現(xiàn)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
// 從本地取出相應(yīng)的保存環(huán)境類(lèi)型
if (ConfigEnv.dev == _env) {
/// IM sdk appId Dev環(huán)境
return 111111111;
} else if (ConfigEnv.pre == _env) {
/// IM sdk appId Pre環(huán)境
return 111111112;
} else if (ConfigEnv.pro == _env) {
/// IM sdk appId Pro環(huán)境
return 111111113;
}
return 0;
}
void init() {
// TODO: implement init
// 初始化的時(shí)候從本地取出
}
// 設(shè)置環(huán)境
setEnv(ConfigEnv env) {
// TODO: implement setEnv
_env = env;
// 更新本地存儲(chǔ)的環(huán)境類(lèi)型
notifyListeners();
}
}
三、使用get_it設(shè)置Release、debug對(duì)應(yīng)的config
使用get_it設(shè)置Release、debug對(duì)應(yīng)的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();
});
// 設(shè)置請(qǐng)求地址及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();
});
// 設(shè)置請(qǐng)求地址及IM
GetIt.instance.registerSingleton<ConfigManager>(debugConfigMgr,
signalsReady: true);
// 初始化IM配置
IMManager().configIM(imSDKAppId: GetIt.instance<ConfigManager>().getImAppId());
}
3.3、代碼中具體使用獲取請(qǐng)求地址
代碼中具體使用獲取請(qǐng)求地址,可以直接使用GetIt.instance().get(ConfigConstant.kAppHost)獲取請(qǐng)求服務(wù)器地址
String requestUrl = GetIt.instance().get(ConfigConstant.kAppHost) + url;
具體請(qǐng)求就可以使用
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);
}
四、小結(jié)
flutter開(kāi)發(fā)實(shí)戰(zhàn)-Release環(huán)境與Debug調(diào)試環(huán)境配置實(shí)現(xiàn),使用的是GetIt進(jìn)行配置,不同環(huán)境實(shí)現(xiàn)不同的config配置即可,比如release請(qǐng)求地址固定的,如果是debug可以切換開(kāi)發(fā)環(huán)境來(lái)處理更多額外的操作。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-561214.html
學(xué)習(xí)記錄,每天不停進(jìn)步。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-561214.html
到了這里,關(guān)于flutter開(kāi)發(fā)實(shí)戰(zhàn)-Release環(huán)境與Debug調(diào)試環(huán)境配置實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!