- こちらのチュートリアルの解説です。
- チュートリアルを読むのが早いと思いますが、概要をまとめたのでこちらもご参照ください。
これまでやったこと
- CleanArchitectureに沿って以下のクラスをすべて実装完了
- Domain層
- Entity
- UseCase
- Repository(Interface)
- Data層
- Repository(Implement)
- Model
- DataSource
- Domain層
今回やること
- get_itを用いてDependency Injection
get_itを使う
- ServiceLocatorであるget_itを用いる
- オブジェクトの注入を行う
サポートするインスタンス作成方法
- SingletonとFactoryがある
- 今回はほぼSingletonを使う
- すべてのclassでState管理をしていないため
- 今回はほぼSingletonを使う
- Presentation logic(BLoC)ではFactoryを使う
- UIがNavigationにより破棄される際にStreamがcloseされるから
- StatefulWidgetでdispose()が呼ばれる際
- BLoCでSingletonを使うと、closeされたStreamを持つインスタンスが使い回されれてしまう
- UIがNavigationにより破棄される際にStreamがcloseされるから
LazySingleton
- lazyは非同期生成
- 今回はどちらを使っても特に変わりはない
Repository
- UseCaseはRepositoryのインターフェイスに依存している
- DIするオブジェクトを用意に変更できる
injection_container.dart
sl.registerLazySingleton<NumberTriviaRepository>(
() => NumberTriviaRepositoryImpl(
remoteDataSource: sl(),
localDataSource: sl(),
networkInfo: sl(),
),
);
初期化
main.dart
import 'injection_container.dart' as di;
void main() async {
await di.init();
runApp(MyApp());
}
学んだこと
- CleanArchitectureに沿って、オブジェクト間の依存をなくすようにDIの形で実装した
- このDIをするのが今回のコーディングになる
- 同じインターフェイスを継承しているクラスのオブジェクトであれば、入れ替えが用意となる
- TDDをしない場合、Fakeクラスを作り実装を進めることができる