1

私はgoogle()の例に従いました。そして、私はそれが一般的なViewModelタイプにバインドすることができることを見ました。Dagger2を使用して複数のViewModelFactoryで地図にバインドする方法

@Module 
abstract class ViewModelModule { 
    @Binds 
    @IntoMap 
    @ViewModelKey(UserViewModel.class) 
    abstract ViewModel bindUserViewModel(UserViewModel userViewModel); 

    @Binds 
    @IntoMap 
    @ViewModelKey(SearchViewModel.class) 
    abstract ViewModel bindSearchViewModel(SearchViewModel searchViewModel); 

    @Binds 
    @IntoMap 
    @ViewModelKey(RepoViewModel.class) 
    abstract ViewModel bindRepoViewModel(RepoViewModel repoViewModel); 

    @Binds 
    abstract ViewModelProvider.Factory bindViewModelFactory(GithubViewModelFactory factory); 
} 

私がしたいことは、複数のViewModelProvider.Factoryを汎用のものにバインドすることです。

@Module 
abstract class ViewModelModule { 


    @Binds 
    @IntoMap 
    @ViewModelFactoryKey(FeedEntryListViewModelFactory.class) 
    abstract ViewModelProvider.Factory bindViewModelFactory(FeedEntryListViewModelFactory factory); 

} 

ViewModelFactoryKey.java

@Documented 
@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@MapKey 
@interface ViewModelFactoryKey { 
    Class<? extends ViewModelProvider.Factory > value(); 
} 

FeedActivity.java

public class FeedActivity extends DaggerAppCompatActivity { 


    @Inject 
    ViewModelProvider.Factory viewModelFactory; 

    FeedEntryListViewModel viewModel; 


    @SuppressLint("StaticFieldLeak") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    ... 
    } 
} 

しかし、それは次のようなエラーがスローされます。

Error:(21, 8) error: [dagger.android.AndroidInjector.inject(T)] android.arch.lifecycle.ViewModelProvider.Factory cannot be provided without an @Provides- or @Produces-annotated method. 
android.arch.lifecycle.ViewModelProvider.Factory is injected at 
com.cn29.aac.ui.feedentry.FeedActivity.viewModelFactory 
com.cn29.aac.ui.feedentry.FeedActivity is injected at 
dagger.android.AndroidInjector.inject(arg0) 

私はDagger2を初めて使用しています。正しく使用されない場合は、お気軽にコメントしてください。ありがとうございました。これに

@Inject 
ViewModelProvider.Factory viewModelFactory; 

+0

'私は何をしたいが、一般的なone'にマルチViewModelProvider.Factoryをバインドすることである - これは何を意味するのでしょうか?あなたはいろいろな工場を持っていて、それらを地図に入れたいのですか? – azizbekian

+0

はい、したいです。実際に私は複数のクラスFeedListViewModelFactory、FeedDetailViewModelFactoryを持っています...しかし、これらのアクティビティでは、注入された型はViewModelProvider.Factoryです。したがって、両方をViewModelProvider.Factoryにマップする必要があります。 –

答えて

0

は、次の変更する必要が

@Inject 
Map<Class<? extends ViewModelProvider.Factory>, Provider<ViewModelProvider.Factory>> viewModelFactoriesMap; 
+0

アクティビティクラスにマップの代わりにファクトリを挿入できませんか? –

+0

[あなたのコメント](https://stackoverflow.com/questions/46601474/how-to-bind-into-map-with-multi-viewmodelfactory-using-dagger2/46603759?noredirect=1#comment80155960_46601474)で、あなたはあなたの工場をマップに入れたいと思っています。あなたは今、正確に何をしたいですか?どの工場を注射すると思われますか? – azizbekian

+0

おっと、私の悪い返事を申し訳ありません。ファクトリを注入するだけで、マッピングはしないようにしたいと思います。 Nvm、今私はdagger2のジェネリック注射に混乱していると思った。とにかく、あなたの助けのためにthx。 –

関連する問題