使用Flutter Module實(shí)現(xiàn)組件化的思路:
Flutter組件化
使用Flutter Package實(shí)現(xiàn)組件化思路:
Flutter 組件化開發(fā)實(shí)踐概述
組件化的優(yōu)點(diǎn):
- 各個(gè)模塊相互獨(dú)立,方便管理
- 抽離出功能,方便多個(gè)
app復(fù)用 - 方便單元測(cè)試
組件化思路:
一、選擇模塊化的方式
有2種方式可實(shí)現(xiàn):Flutter Package和Flutter Module
區(qū)別:
Flutter Package:用于單獨(dú)的Flutter、Dart代碼,不依賴與原生iOS/Android代碼,生成的Package目錄里沒有iOS/Android目錄,可創(chuàng)建exampleflutter項(xiàng)目配合測(cè)試。Flutter Module:常用于在原生iOS/Android項(xiàng)目中集成Flutter項(xiàng)目的混合開發(fā),創(chuàng)建的Module中有.iOS/.android目錄,單獨(dú)的Module可單獨(dú)在iOS和Android上運(yùn)行測(cè)試。
二、模塊存放位置
- 可與原有項(xiàng)目放在一起,在
pubspec.yaml中使用path來引入 - 將模塊放入
git庫中,在pubspec.yaml中使用url來引入 - 建立私有
pub,將模塊發(fā)布到私有pub上
三、將項(xiàng)目劃分不同的模塊
- 網(wǎng)絡(luò)模塊(
Network Package) - 通用的基礎(chǔ)類和工具類(多個(gè)
Common Package) - 業(yè)務(wù)模塊A(
A Package) - 業(yè)務(wù)模塊B(
B Package) - 業(yè)務(wù)模塊...
單個(gè)模塊提供一個(gè)對(duì)外的dart來供導(dǎo)入使用,模塊內(nèi)部使用export對(duì)內(nèi)部文件進(jìn)行細(xì)粒度的暴露。
library common_service;
export 'a.dart';
export 'b.dart';
四、單獨(dú)測(cè)試模塊
- 如果使用
Flutter Module,可單獨(dú)運(yùn)行Module - 如果使用
Flutter Package,可創(chuàng)建Flutter example測(cè)試項(xiàng)目來測(cè)試
五、加載Package或Module里的資源文件
單個(gè)組件的安裝包和整個(gè)組件的安裝包資源位置不一樣。
- 在
Package或Module里運(yùn)行:正常的使用方法,比如'images/base/login_button.png' - 在主項(xiàng)目里運(yùn)行
Package或Module:在正常使用方法的路徑前增加'packages/模塊名/',比如'packages/login_module/images/base/login_button.png'
資源引入路徑不一致解決方案:
可通過主項(xiàng)目運(yùn)行時(shí),往模塊中傳入自定義參數(shù),根據(jù)參數(shù)判斷資源引用的路徑前是否添加'packages/模塊名/'。
bool.fromEnvironment可用來判斷是否是生產(chǎn)環(huán)境,比如final isProduct = const bool.fromEnvironment('dart.vm.product');,也可以用來判斷自定義參數(shù),比如flutter run --dart-define=IS_ADD_PACKAGE_PATH=true,參數(shù)名稱為IS_ADD_PACKAGE_PATH,值為true。
代碼中使用:
// 定義全局變量
static const IS_ADD_PACKAGE_PATH = bool.fromEnvironment('IS_ADD_PACKAGE_PATH', defaultValue: true);
// 具體使用
'${IS_ADD_PACKAGE_PATH ? 'packages/login_module/' : ''}images/base/login_button.png'
- 命令行
flutter run運(yùn)行添加自定義參數(shù):
flutter run --dart-define=IS_ADD_PACKAGE_PATH=true - Android Studio運(yùn)行添加自定義參數(shù):
在main.dart的run/debug configrations中配置,如下:
image.png
六、減少各模塊之間的耦合
比如主項(xiàng)目引用模塊,模塊引用主項(xiàng)目,會(huì)出現(xiàn)很多耦合,盡量減少。
解決思路:
- 組件引入主項(xiàng)目的耦合部分,盡量抽取為公共庫
- 在路由上做文章,減少引入
