无法使用dagger2 android java注入ViewModel
我正试图在匕首2中使用一个常见的ViewModelProviderFactory注入viewmodel。(这是我第一个使用dagger和architecure组件的应用程序)这是我在构建代码时遇到的错误 错误:(26,10)错误:如果没有@Provides注释的方法,则无法提供java.util.Map、javax.inject.Provider> 这是我使用的代码 ViewModelProviderFactory无法使用dagger2 android java注入ViewModel,java,android,mvvm,dagger-2,android-architecture-components,Java,Android,Mvvm,Dagger 2,Android Architecture Components,我正试图在匕首2中使用一个常见的ViewModelProviderFactory注入viewmodel。(这是我第一个使用dagger和architecure组件的应用程序)这是我在构建代码时遇到的错误 错误:(26,10)错误:如果没有@Provides注释的方法,则无法提供java.util.Map、javax.inject.Provider> 这是我使用的代码 ViewModelProviderFactory @PerActivity public class ViewModelPro
@PerActivity
public class ViewModelProviderFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public ViewModelProviderFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(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 (Exception e) {
throw new RuntimeException(e);
}
}
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
应用程序组件
@Singleton
@Component(modules = {ApplicationModule.class, ViewModelModule.class})
public interface ApplicationComponent {
void inject(BaseApp app);
@ApplicationContext
Context getContext();
Application getApplication();
WebService getWebService();
PreferencesHandler getPreferencesHandler();
InternetUtils getInternetUtils();
}
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
void inject(MainActivity mainActivity);
void inject(SampleListActivity sampleListActivity);
void inject(HomeActivity homeActivity);
}
活动组件
@Singleton
@Component(modules = {ApplicationModule.class, ViewModelModule.class})
public interface ApplicationComponent {
void inject(BaseApp app);
@ApplicationContext
Context getContext();
Application getApplication();
WebService getWebService();
PreferencesHandler getPreferencesHandler();
InternetUtils getInternetUtils();
}
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
void inject(MainActivity mainActivity);
void inject(SampleListActivity sampleListActivity);
void inject(HomeActivity homeActivity);
}
ViewModelKey
@PerActivity
public class ViewModelProviderFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public ViewModelProviderFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@SuppressWarnings("unchecked")
@Override
public <T extends ViewModel> T create(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 (Exception e) {
throw new RuntimeException(e);
}
}
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
您的
ActivityComponent
是一个依赖于ApplicationComponent
的组件(不是子组件),因此它无法访问AppComponent中设置的映射
对于您的活动组件
,请切换到使用子组件
,或者确保为MapI am doing而不使用工厂提供方法。看一看,请包含完整的错误消息(“没有[…]就无法提供”之后的“堆栈”跟踪)一开始看起来很好glance@DavidMedenjak更新了问题。添加了生成错误的图像。@Volkanshin45每次重新创建活动/片段时,您的方法都会创建一个新的\uuuuuuuu ViewModel
非范围实例,也就是说,它在配置更改后无法生存,并且不会收到onCleared()
回调,因为它没有使用ViewModelProviders绑定到LifecycleOwner
。您最好不要使用AAC ViewModel,因为它无法按预期的方式工作。不正确地使用框架不是解决方案;)@我不知道。我将恢复最后的更改。谢谢,你救了我的命。工作起来很有魅力。非常感谢你,我添加了地图