如何使用Dagger2@InjectandroidViewModel?
我目前正在调查我的Android应用程序中使用的如何使用Dagger2@InjectandroidViewModel?,android,dagger-2,android-viewmodel,Android,Dagger 2,Android Viewmodel,我目前正在调查我的Android应用程序中使用的Dagger2 implementation 'com.google.dagger:dagger:2.21' annotationProcessor 'com.google.dagger:dagger-compiler:2.21' implementation 'com.google.dagger:dagger-android:2.21' implementation 'com.google.dagger:dagger-android-suppo
Dagger2
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
我已经成功地@注入了视图模型及其关联的存储库
使用以下代码:-
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
@Singleton
public class DaggerViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public DaggerViewModelFactory(final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(final Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown model class " + modelClass);
}
try {
return (T) creator.get();
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
}
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(final DaggerViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(StilettoViewModel.class)
abstract ViewModel provideStilettoViewModel(final StilettoViewModel stilettoViewModel);
}
还有这个匕首模块
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.ViewModelProvider;
import dagger.Binds;
import dagger.Module;
import dagger.multibindings.IntoMap;
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.AndroidViewModelFactory bindAndroidViewModelFactory(final DaggerAndroidViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(MyAndroidViewModel.class)
abstract AndroidViewModel provideArticlesViewModel(final ArticlesViewModel articlesViewModel);
}
当我遇到此错误时,将不会生成此代码
error: [Dagger/MissingBinding] MyAndroidViewModel cannot be provided without an @Inject constructor or an @Provides-annotated method.
是否可以使用Dagger2注入androidx.lifecycle.AndroidViewModel
我的实现哪里出了问题?如果您有一个@模块,它提供应用程序(或者您使用@BindsInstance
+@Component.Builder
,或者可以正常工作):
及
然后,现在不再使用AndroidViewModel:
public class MyViewModel extends AndroidViewModel {
public MyViewModel(Application app) {
...
}
}
您可以将常规ViewModel与@Inject
构造函数一起使用:
public class MyViewModel extends ViewModel {
@Inject
MyViewModel(Application app) {
...
}
}
通过您的DaggerViewModelFactory
将ViewModel对象注入刀柄,您可以像使用任何其他常规ViewModel类一样使用它。
阅读更多关于
将构造函数注释为ViewModelInject
,它是提供视图模型工厂的
@AndroidEntryPoint
class HomeFragment : Fragment() {
private val homeViewModel: HomeViewModel by viewModels()
}
视图模型类为:
class HomeViewModel @ViewModelInject constructor(
authorizationRepository: AuthorizationRepository
) : ViewModel()
将以下附加依赖项添加到Gradle文件中
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
问题是关于AndroidViewModel的。如果扩展AndroidViewModel,则需要将应用程序注入ViewModel中。
@AndroidEntryPoint
class HomeFragment : Fragment() {
private val homeViewModel: HomeViewModel by viewModels()
}
class HomeViewModel @ViewModelInject constructor(
authorizationRepository: AuthorizationRepository
) : ViewModel()
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'