Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用dagger2 android java注入ViewModel_Java_Android_Mvvm_Dagger 2_Android Architecture Components - Fatal编程技术网

无法使用dagger2 android java注入ViewModel

无法使用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

我正试图在匕首2中使用一个常见的ViewModelProviderFactory注入viewmodel。(这是我第一个使用dagger和architecure组件的应用程序)这是我在构建代码时遇到的错误

错误:(26,10)错误:如果没有@Provides注释的方法,则无法提供java.util.Map、javax.inject.Provider>

这是我使用的代码

ViewModelProviderFactory

@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,因为它无法按预期的方式工作。不正确地使用框架不是解决方案;)@我不知道。我将恢复最后的更改。谢谢,你救了我的命。工作起来很有魅力。非常感谢你,我添加了地图