MVPとDagger 2-Androidアプリケーションスケルトン-パート2

この記事は研究の結果であり、その副産物は、非常に便利でかつて行方不明になったAndroidアプリケーションであるMy Location Notifierでの長年のアイデアの具体化でした。ユーザーの到着を受信者に自動的に通知するように設計されています(詳細な説明はこちら



そのため、最初の部分では、MVPアーキテクチャに従ってAndroidアプリケーションのメインスケルトンを構築しました。 それでは、Dagger 2のねじ込みを始めましょう。



2.1。 プリセット



開始するには、build.gradleファイル(プロジェクト:mymvcapp)に移動し、次の行をbuildscriptセクションに追加します。



ext.dagger2_version = "2.8"
      
      





この記事の執筆時点では、これはDagger 2の最新バージョンです。次に、build.gradleファイル(モジュール:アプリ)に移動して、行を先頭に追加します。



 apply plugin: 'kotlin-kapt'
      
      





これは、Dagger 2でコンパイル時にコードを生成できるようにするために必要です。 後であなたは理由を理解するでしょう。



次に、必要な依存関係を追加します。



 implementation "com.google.dagger:dagger:$dagger2_version" kapt "com.google.dagger:dagger-compiler:$dagger2_version"
      
      





2.2。 注射剤



プロジェクトを同期して、MainScreenコンポーネントに戻ります。 backstageパッケージにクラスdi.MainScreenModuleを作成し、 Moduleアノテーションでマークします。 新しいクラスでは、providePresenter()メソッドを宣言して実装します。MainScreenPresenter= MainScreenPresenterを提供しシングルトン注釈を提供ます 。 したがって、クラスは次のようになります。



 @Module class MainScreenModule { @Provides @Singleton fun providesPresenter(): MainScreenPresenter = MainScreenPresenter() }
      
      





次に、MainScreenCompatActivityクラスに移動して、プレゼンター変数の修飾子をlateinit varに置き換え、値の割り当てを削除して、Injectアノテーションでマークします。



 class MainScreen : BaseCompatActivity(), MainScreenContract.View { @Inject lateinit var presenter: MainScreenPresenter override fun init(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main_screen) presenter.attach(this) } }
      
      





この変数にアクセスするときに疑問符が不要になったことに注意してください。

すべてが注入され、タスクが完了したように見えるかもしれません。 しかし、違います。 ここで、最初の依存関係を注入するために必要なコードを生成するためにDaggerを取得する必要があります。 そのため、上記のビルドスクリプトにkotlin-kaptプラグインを追加しました。 com.caesar84mx.mymvcappパッケージで、di.configパッケージを作成し、その中にAppDiComponentインターフェイスを作成します。







次に、インターフェースをコンポーネント、シングルトン、悲惨なものとして宣言し、モジュールを登録し、インターフェース内で注入メソッド(mainScreenActivity:MainScreen)を宣言します。



 @Component( modules = [ MainScreenModule::class ] ) @Singleton interface AppDiComponent { fun inject(mainScreenActivity: MainScreen) }
      
      





そして最後に、必要なすべてのコードを生成するためにDaggerを取得する必要があります。 これを行うには、config.diパッケージにMyMvpAppクラスを作成し、Applicationクラスからそれを継承し、android:name = "。Config.di.MyMvpApp"という行をapplicationタグに記述して、クラスをAndroidManifest.xmlに登録します。 次に、変数lateinit var injection:AppDiComponentを宣言し、プライベートセッターに設定して、onCreate()メソッドを再定義します。 そして魔法を開始します。



 class MyMvpApp: Application() { lateinit var injector: AppDiComponent private set override fun onCreate() { super.onCreate() injector = DaggerAppDiComponent.builder() .mainScreenModule(MainScreenModule()) .build() } }
      
      





ご覧のとおり、DaggerAppDiComponentクラスはまだ存在せず、アプリケーションのビルド中に生成されます。 コンポーネントの実装も同様です。 クラス名は、「ダガー」という単語と、コンポーネントとしてマークされたインターフェイスの名前で構成されます。 mainScreenModule()メソッドもプロジェクトのビルド中に生成されます。名前は、lowerCamelCaseに挿入されたモジュールのクラス名から作成する必要があります。



プロジェクトを組み立てます(ビルド→プロジェクトの作成)。 自動コード生成をお楽しみください。



2.3。 注入



注意:さらに、ポルノの要素を持つタンバリンとのいくつかのダンスが提示されます。 画面から子供や神経質な人を削除する要求。



注入を成功させるには、インジェクター変数への参照が必要です。 同意して、注入する各クラスでMyMvpAppのインスタンスを作成することは最適なソリューションではありません。 したがって、次のことを行います。



 class MyMvpApp: Application() { lateinit var injector: AppDiComponent private set override fun onCreate() { super.onCreate() INSTANCE = this injector = DaggerAppDiComponent.builder() .mainScreenModule(MainScreenModule()) .build() } companion object { private var INSTANCE: MyMvpApp? = null @JvmStatic fun get(): MyMvpApp = INSTANCE!! } }
      
      





吐き出され、MainScreenクラスに戻ります。 次に、プレゼンターをinit()メソッドに挿入します。 挿入された変数に最初にアクセスする前に、このアクションを実行する必要があることを忘れないでください。 したがって、クラスは次のようになります。



 class MainScreen : BaseCompatActivity(), MainScreenContract.View { @Inject lateinit var presenter: MainScreenPresenter override fun init(savedInstanceState: Bundle?) { setContentView(R.layout.activity_main_screen) MyMvpApp.get().injector.inject(this) presenter.attach(this) } }
      
      





そして、ここに私たちのアプリケーションの全体的な基本構造があります:







2.4。 おわりに



そのため、最小限のアプリケーション構造が用意されており、その上に残っているのは要素をハングさせることだけです。 新しいアクティビティが必要ですか? バックステージからUIを分離したコンポーネントとしてコンポーネントを表し、必要な依存関係を決定します(最小、アクティビティのプレゼンター、またはリモートサービスとやり取りするためのプレゼンター自体のAPI、またはデータベースを操作するためのリポジトリAPIなど)。モジュールを依存関係に登録し、モジュールをコンポーネントに登録し、ビルダーに登録し、プロジェクトを再構築し、必要に応じて依存関係を注入し、新しいコンポーネントごとに繰り返しを繰り返します。



もちろん、疑問が生じるかもしれません。なぜダガーが必要なのでしょうか? 結局のところ、彼らは素晴らしい仕事をしましたか? アプリケーションは小さいですが、素晴らしいです。 数十のアクティビティ、フラグメント、アダプター、サーバーリクエスト、データキャッシュ、その他の不思議がいっぱいになると、Dependency Injectionを使用しない場合、大規模なアプリケーションで追跡するのが困難な多くの依存関係が発生します。 Dagger DIフレームワークは、実装と追跡のタスクを簡素化するのに役立ちます。



All Articles