私は、ダガーを注入しながら新しいアーキテクチャコンポーネントViewModel
をアプリケーションに追加しようとしています。 googleがhereと表示したコードに基づいています。私はそれぞれViewModel
タイプのためにViewModelFactory
を避けようとしているので、Map<Class<? extends ViewModel>, Provider<ViewModel>> creators
を受け取るViewModelFactory
を使用しました。これは@Singleton
スコープの依存関係を持つViewModels
で動作します。しかし、私のViewModels
の1つは、そのフラグメントに由来する依存性を持っています。これは、そのフラグメントのモジュールです:アーキテクチャのコンポーネントViewModelsは、アクティビティ/フラグメントからのパラメータを持つダガーを挿入します。
@Module
public abstract class DownloadIssueDialogFragmentModule {
@Binds
abstract DialogFragment dialogFragment(DownloadIssueDialogFragment dialogFragment);
@Provides
@FragmentScope
static Issue provideIssue(DownloadIssueDialogFragment dialogFragment) {
return dialogFragment.getIssue();
}
}
そして、私のViewModelModule
:
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(DownloadIssueViewModel.class)
abstract ViewModel bindDownloadIssueViewModel(DownloadIssueViewModel viewModel);
}
短剣は、それがIssue
を提供することができないと言います。 Map<Class<? extends ViewModel>, Provider<ViewModel>>
はコンパイル時に作成されたようです。しかし、私は、その断片の範囲内でのみパラメータを知っているでしょう。どうすればこれを達成できますか?
ありがとうございます。
EDIT:最後に
私は別のアプローチを行ってきました。今度はViewModelごとにファクトリを作成し、ViewModelをインジェクトするのではなく、ファクトリを挿入します。
私はこのライブラリを作成しました:AutoViewModelFactory
自動的に工場を生成するには。これまでに私が見つけた最高のソリューションです。
'@ Binds'と' @ Provides'を同じクラスで一緒に使うことはできません。あなたはそれらの1つを使うべきです。ちょうどfyi。 – mertsimsek
@mertsimsek提供が静的である場合は、 '@ Binds'と' @ Provides'を持つことができます。私は自分自身の 'ViewModel'を使ってこれをGoogleのものに変更しようとしました(私は' ViewModel'を回転中に保持する必要がありました)。 –