Flutter:基于 Provider 實(shí)現(xiàn)多環(huán)境構(gòu)建配置

建議使用 flutter_flavor 實(shí)現(xiàn)。

多環(huán)境構(gòu)建配置,在實(shí)際的開發(fā)工作中是很有必要的漂彤。但是 Flutter 沒有類似 .env 的配置,所以,只能是另辟蹊徑洞渔。本文是總結(jié)網(wǎng)上一堆經(jīng)驗(yàn)的一次實(shí)踐,上手相對(duì)簡(jiǎn)單缚态。

Production 模式 Development 模式

一磁椒、基本操作步驟

  • 安裝 Provider 依賴;
  • 拆分原有的 main.dart 為 2 個(gè)部分玫芦,一部分為 main()浆熔,一部分為 App() MaterialApp 組件;
  • 建立對(duì)應(yīng)各個(gè)環(huán)境的入口文件桥帆,如:main_prod.dart医增、main_dev.dart慎皱;
  • 建立環(huán)境配置類 class Env(),給定默認(rèn)參數(shù)叶骨,并支持傳入新的配置參數(shù)茫多;
  • 建立狀態(tài)管理類 class StateEnv with ChangeNotifier
  • 在對(duì)應(yīng)的入口中使用 Provider 掛載應(yīng)用忽刽,并指定為對(duì)應(yīng)的環(huán)境模式天揖;
  • 在頁(yè)面中使用 Provider.of<StateEnv>(context) 的方式獲取"環(huán)境變量";
  • 啟動(dòng)調(diào)試跪帝;

二宝剖、詳細(xì)步驟

以下是詳細(xì)操作步驟:

2.1 安裝 Provider 依賴

Provider 是 flutter 開發(fā)常用的一個(gè)狀態(tài)管理庫(kù),參考官方的安裝教程安裝歉甚。

安裝 Provider 依賴

2.2 拆分原有的 main.dart

為了減少冗余代碼万细,我們將拆分原有的 main.dart 為 2 個(gè)部分:一部分為 main() 方法,一部分為 App() MaterialApp 組件纸泄;

// 拆分后的 ./lib/main.dart
// import 略···

// 這里 import 我們拆分后的 app.dart
import 'app.dart';

void main() {
  runApp(App());
}
// 新建 ./lib/app.dart赖钞,并粘貼原來實(shí)現(xiàn) MaterialApp 的代碼
// import 略···
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      // 組件內(nèi)容略 ···
    );
  }
}

2.3 建立對(duì)應(yīng)各個(gè)環(huán)境的入口文件

為不同的構(gòu)建環(huán)境創(chuàng)建不同的入口文件,這里暫先創(chuàng)建 2 個(gè)入口聘裁,分別為 main_prod.dart雪营、main_dev.dart,直接復(fù)制原來 main.dart的內(nèi)容到新建的兩個(gè)文件衡便。

// ./lib/main_dev.dart
// import 略···

// 這里 import 我們拆分后的 app.dart
import 'app.dart';

void main() {
  runApp(App());
}

main_prod.dart 的文件內(nèi)容同上献起。

2.4 建立環(huán)境配置類 class Env()

我們需要建立一個(gè)通用配置文件,如:class Env镣陕,并根據(jù)不同的環(huán)境實(shí)例化它谴餐,如:開發(fā)環(huán)境 new Env( mode: 'dev' ),生產(chǎn)環(huán)境 new Env( mode: 'prod' ) 等呆抑。同時(shí)岂嗓,為了統(tǒng)一管理,我還建立了一個(gè)環(huán)境枚舉 EnvMode鹊碍。./lib/utils/env.dart 是我們的環(huán)境配置類厌殉,具體文件內(nèi)容如下:

// ./lib/utils/env.dart
// 環(huán)境變量配置

// 環(huán)境標(biāo)識(shí)
enum EnvMode {
  PRODUCTION, // 生產(chǎn)環(huán)境
  DEVELOPMENT, // 開發(fā)環(huán)境
  TEST, // 測(cè)試環(huán)境
  UAT, // 預(yù)發(fā)布環(huán)境
}

class Env {
  // 環(huán)境標(biāo)識(shí)
  final EnvMode mode;

  // 接口參數(shù)
  final String api;

  // 應(yīng)用基礎(chǔ)配置
  final String appName;

  Env({
    this.mode = EnvMode.PRODUCTION,
    this.api = '',
    this.appName = 'Flutter 學(xué)習(xí)',
  }) : super();
}
  • mode 是當(dāng)前環(huán)境標(biāo)識(shí),可以使用類似 Env.mode == EnvMode.DEVELOPMENT 的方式判斷當(dāng)前構(gòu)建模式侈咕;
  • api 是當(dāng)前模式使用的數(shù)據(jù)請(qǐng)求接口公罕;
  • appName 是一個(gè)演示變量;

實(shí)際開發(fā)中耀销,我們需要根據(jù)環(huán)境配置的內(nèi)容可遠(yuǎn)不止這么多楼眷。

2.5 建立狀態(tài)管理類

Provider 需要一個(gè)支持狀態(tài)響應(yīng)的類,建立一個(gè) StateEnv 類,內(nèi)容如下:

// ./lib/state/state_env.dart
// 環(huán)境狀態(tài)配置
// import 略 ···

class StateEnv with ChangeNotifier {
  // 環(huán)境配置
  final Env config;

  StateEnv({this.config}) : super();

  // 獲取環(huán)境模式
  EnvMode get mode => this.config.mode;

  // 獲取接口配置
  String get api => this.config.api;

  // 獲取應(yīng)用名稱
  String get appName => this.config.appName;
}

2.6 在對(duì)應(yīng)的入口中使用 Provider 掛載應(yīng)用摩桶;

接下來修改我們的入口文件桥状,按照 Provider 的語(yǔ)法初始化即可帽揪。

// ./lib/main_dev.dart
void main() {
  // 實(shí)例化應(yīng)用
  runApp(
    // 支持多個(gè)狀態(tài)管理
    MultiProvider(
      providers: [
        // 環(huán)境配置
        ChangeNotifierProvider(
          create: (BuildContext context) => StateEnv(
            config: Env(
              mode: EnvMode.DEVELOPMENT, // 使用開發(fā)環(huán)境
              api: 'http://127.0.0.1:3000', // 指定該環(huán)境對(duì)應(yīng)的數(shù)據(jù)請(qǐng)求接口
            ),
          ),
        ),
      ],
      child: App(), // App 掛載
    ),
  );
}

2.7 在頁(yè)面中讀取配置

其他頁(yè)面可以使用 Provider.of<StateEnv>(context, listen: false) 訪問狀態(tài)中的值硝清,如:

// 偽代碼
appBar: AppBar(
  title: Text(Provider.of<StateEnv>(context, listen: false).appName),
)
// ./lib/app.dart
class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: Provider.of<StateEnv>(context, listen: false).appName,
      debugShowCheckedModeBanner: Provider.of<StateEnv>(context).mode == EnvMode.DEVELOPMENT, // 是否顯示右上角 debug 徽標(biāo)
      home: HomePage(),
    );
  }
}

2.8 啟動(dòng)調(diào)試

以 IntelliJ IDEA 為例,只需要為不同的入口建立運(yùn)行配置即可转晰。

啟動(dòng)調(diào)試
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芦拿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子查邢,更是在濱河造成了極大的恐慌蔗崎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扰藕,死亡現(xiàn)場(chǎng)離奇詭異缓苛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)邓深,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門未桥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芥备,你說我怎么就攤上這事冬耿。” “怎么了萌壳?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵亦镶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我袱瓮,道長(zhǎng)缤骨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任尺借,我火速辦了婚禮荷憋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘褐望。我一直安慰自己勒庄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布瘫里。 她就那樣靜靜地躺著实蔽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谨读。 梳的紋絲不亂的頭發(fā)上局装,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼铐尚。 笑死拨脉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宣增。 我是一名探鬼主播玫膀,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼爹脾!你這毒婦竟也來了帖旨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灵妨,失蹤者是張志新(化名)和其女友劉穎解阅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泌霍,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡货抄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朱转。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟹地。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肋拔,靈堂內(nèi)的尸體忽然破棺而出锈津,到底是詐尸還是另有隱情,我是刑警寧澤凉蜂,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布琼梆,位于F島的核電站,受9級(jí)特大地震影響窿吩,放射性物質(zhì)發(fā)生泄漏茎杂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一纫雁、第九天 我趴在偏房一處隱蔽的房頂上張望煌往。 院中可真熱鬧,春花似錦轧邪、人聲如沸刽脖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)曲管。三九已至,卻和暖如春硕糊,著一層夾襖步出監(jiān)牢的瞬間院水,已是汗流浹背腊徙。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留檬某,地道東北人撬腾。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像恢恼,于是被迫代替她去往敵國(guó)和親民傻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容