為Flutter而生的輕量級依賴檢索容器—Dartin

ditclear發表於2019-03-23

什麼是Flutter?

Flutter 是 Google推出並開源的移動應用開發框架,主打跨平臺、高保真、高效能。開發者可以通過 Dart語言開發 App,一套程式碼同時執行在 iOS 和 Android平臺。

Flutter官網:flutter-io.cn

在學習Flutter一段時間之後,我們已經在實際專案中進行了實踐,效果還是蠻不錯的:無差的UI、同樣的業務邏輯、減少溝通交流的成本、HotReload等等都是令人願意繼續深耕的理由

但與Android/IOS等發展多年、穩定高效的開發模式相比,無疑還處在新生階段。在編寫Dart程式碼的這段時間中,我嘗試將以前的開發經驗遷移到Flutter專案中,其中自然也包括依賴注入的思想,但發現社群還沒有提供這樣的第三方依賴,但實際是有這方面需求的,在google關於flutter第二期的問答中,也提到了相關的問題。

issue

因為以前有寫過分析Koin依賴檢索原理的文章(當Koin撞上ViewModel),有這方面知識的積累。加上近期在運用flutter-provide進行狀態管理的過程中發現provide稍加改進便可以化身為一個依賴注入框架,於是我便動手進行了這方面的改造。

DartIn

靈感來自於Koin(一個為Kotlin開發者提供的輕量級依賴檢索容器)。

用法也跟Koin類似,程式碼總共就261行(包括註釋),易於使用也方便理解。

github地址:github.com/ditclear/da…

dartin已經上傳到pub,方便Flutter開發者整合。

dependencies:
  dartin: ^0.1.0
複製程式碼

一些關鍵的方法:

  • single:建立一個提供全域性唯一的例項的provider。
  • lazy:建立一個provider,當第一次使用到它的時候才會建立例項。
  • factory:建立一個provider,每次都會提供新的例項。
  • inject:注入物件

更多資訊可以檢視dartin.dart

快速開始

  1. 建立Module,配置依賴
//scope 必須是全域性的,並且是靜態不可變的
const test = DartInScope('test');

//在Module構造方法中定義的依賴配置會放到預設的作用域_defaule中
final viewModelModule = Module([
  factory<HomeProvide>(({params}) => HomeProvide(params.get(0), get<GithubRepo>())),
])
  ..addOthers(test , [
    ///other scope
   factory<HomeProvide>(({params}) => HomeProvide(params.get(0), get<GithubRepo>())),
  ]);

final repoModule = Module([
  lazy<GithubRepo>(({params}) => GithubRepo(get<GithubService>())),
]);

final remoteModule = Module([
  single<GithubService>(GithubService()),
]);

final appModule = [viewModelModule, repoModule, remoteModule];
複製程式碼

2 . 載入配置項到dartins

void main() {
  startDartIn(appModule);
  runApp(MyApp());
}
複製程式碼
  1. 進行依賴檢索注入例項
//注入一個簡單的例項
final service = inject<GithubService>();
//動態提供引數
final test = inject<HomeProvide>(params: ['title']);
//根據scope提供不同的例項
final test = inject<HomeProvide>(scope:test, params: ['title']);
複製程式碼

更多的例子可以檢視 github.com/ditclear/mv…

原理很簡單,總的來說就是一個依賴容器Map,key為配置的依賴型別,值為封裝的一層Provider

factory(({params}) => HomeProvide(params.get(0), get()))

Key 就是 HomeProvider , 值是factory返回的一個Provider

當需要獲取例項的時候,通過需要例項的runtimeType,通過Provider.get()方法根據是single/lazy/factory去提供相應的例項,所以記住寫好T很重要

寫在最後

DartIn是站在巨人肩膀上的產物,功能有了,但和Koin這種框架比較起來還有許多需更進一步,包括完善的單元測試、型別安全、更合理的提示,依賴構建的路徑提供,今後我也將持續完善它,也希望能拋磚引玉,早日出現更好的依賴注入框架。

最後? welcome to star、 fork and pull request.

========================== 分割線 ==========================

如果你想了解更多關於MVVM、Flutter、響應式程式設計方面的知識,歡迎關注我。

你可以在以下地方找到我:

簡書:www.jianshu.com/u/117f1cf0c…

掘金:juejin.im/user/582d60…

Github: github.com/ditclear

為Flutter而生的輕量級依賴檢索容器—Dartin

相關文章