
今日は、 Dagger 2について、特にdagger-android 、 Android Architecture Componentsについて、およびそれらを使用するときに遭遇した問題についてお話したいと思います。 おそらく、投稿は哲学的なほど認知的ではありません。投稿を作成する理由(少なくとも主観的)があるため、すぐにスリッパを投げないようにお願いします。
私はこの投稿を書く価値があるかどうか長い間考えていましたが、内部のバランスが揺らいでいました。
確かに、あなたの多くはすでにプロジェクトで上記のツールを使用しているか、少なくともこれを使ってこれがどんな獣であるかを理解しています。 だから私は最終的に、プロジェクトでそれらを使用する必要があるという結論に達しました。
これらのツールで達成したいことについて:
- 「粘り強い」ビューモデルの助けを借りて構成を変更することで悪夢を忘れる
- Daggerを使用して、依存関係をビューアに直接配信します
- 依存関係のスコープを整理する
- newfangled dagger-androidを使用する
理解を深めるための小さなコード:
class App : DaggerApplication() { override fun applicationInjector(): AndroidInjector<out App> = DaggerAppComponent.builder().create(this) }
@Singleton @Component(modules = [ (AndroidSupportInjectionModule::class), (AppModule::class), (ActivityBuilder::class) ]) interface AppComponent : AndroidInjector<App> { @Component.Builder abstract class Builder : AndroidInjector.Builder<App>() }
@Module abstract class ActivityBuilder { @ActivityScope @ContributesAndroidInjector(modules = [MainActivityModule::class, FragmentProvider::class, RepositoryModule::class]) abstract fun bindMainActivity(): MainActivity }
@Module class RepositoryModule { @Provides @ActivityScope fun provideSomeDataRepository(socket: SocketService, restApi: RestApi, feedDao: FeedDao, userSettings: UserSettings): SomeDataRepository = SomeDataRepositoryImpl(socket, restApi, feedDao, userSettings)
@Inject lateinit var factory: MainViewModelFactory private lateinit var viewModel: MainViewModel viewModel = ViewModelProviders.of(this, factory) .get(MainViewModel::class.java)
class MainViewModelFactory @Inject constructor(private val someDataRepository: SomeDataRepository) : ViewModelProvider.Factory{ override fun <T : ViewModel?> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MainViewModel::class.java)) { return MainViewModelImpl(someDataRepository) as T } throw IllegalArgumentException(String.format("%s Not Found", modelClass.simpleName)) } }
class MainViewModelImpl @Inject constructor(someDataRepository: SomeDataRepository) : MainViewModel(), MainViewModel.Input, MainViewModel.Output
したがって、これらすべての操作から取得したいリストについてです。
すべてが正常で、すべてが機能しますが、1つの機能に気付きました(少し後で明らかになりました)。 構成を変更した後、Daggerは依存関係を新たに作成します。
これらのツールの開発経験が少ないため、他の開発者にアドバイスを求めることにしました。私は、この状況は当たり前であり、ガベージコレクターはこの混乱に対処し、すべてが正常に機能すると答えました。
「unshifted」についての投稿のタイトルを参照すると、問題のどこかで短剣によって読まれました(単語の引用の単語ではなく、意味は同じです):「あなたはこれら2つのツールのベストを組み合わせようとしています。 」
もちろん、Androidの短剣を使用することはできず、AndroidViewModel(アプリケーション:Applitaction)を使用して依存関係をビューモデルに直接送信することはできませんが、視聴者はApplicationクラスを知らないため、これは機能しません。 私にとって、このクラスが存在する理由は未だに謎です。 誰かがコメントで説明できますか?
上記のすべてを要約すると、1つの質問があります。自分のやりたいことができるのでしょうか。 構成を変更するときに、この制御されていない短剣オブジェクトの作成を取り除くことは可能ですか?
ご意見をお寄せいただきありがとうございます。