【问题标题】:<android.arch.lifecycle.ViewModel>> cannot be provided without an @Provides-annotated method<android.arch.lifecycle.ViewModel>> 不能在没有@Provides-annotated 方法的情况下提供
【发布时间】:2019-06-16 13:59:32
【问题描述】:

我正在尝试创建一个像 example 这样的视图模型模块,但我遇到了这个错误

错误:java.util.Map,javax.inject.Provider> 不能在没有 @Provides 注释的方法的情况下提供。

我按照所有示例进行操作,这是我的代码

ViewModelFactory 类

@Singleton
public class ViewModelFactory implements ViewModelProvider.Factory {

    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> mCreators;

    @Inject
    ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
        mCreators = creators;
    }

    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        Provider<? extends ViewModel> creator = mCreators.get(modelClass);
        if (creator == null) {
            for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : mCreators
                    .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);
        }
    }
}

ViewModelModule 类

@Module
public abstract class ViewModelModule {

    @Binds
    abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);

}

这是组件

@Singleton
@Component(modules = {AppModule.class, ViewModelModule.class})
public interface MainComponent {


    void inject(Sdk sdk);

    void injectTestActivity(TestActivity testActivity);


}

ps:这个实现在android库中,不在应用项目中

【问题讨论】:

  • 嗨。这真的很奇怪。你能发布关于视图模型的依赖注入代码吗?
  • 我没有在我的视图模型中进行任何注入
  • 您是否有任何从 Dagger 注入并标记为 @MapKey(BlahViewModel.class) 并随后以 @Binds 暴露为 ViewModel 的 ViewModel?
  • 我没有注入任何视图模型,我提供了我自己的@ViewModelKey 注释

标签: java android dependency-injection viewmodel dagger-2


【解决方案1】:

您需要使用 Dagger multibindings 绑定您的视图模型。换句话说,绑定您的视图模型并使用@IntoMap 多绑定注释对其进行注释。在您发布的同一个示例中,您可以找到它的示例here。在示例中,他们创建了ViewModelKey 注释,以指定 Dagger 可以从地图中检索您的视图模型的键(通常是视图模型的类)。 Dagger 将在编译时创建地图,这就是你得到错误的原因 - 如果你没有指定任何视图模型作为地图的一部分,Dagger 就无法知道它应该实例化哪些类型。

【讨论】:

  • 好的,我已经有了 ViewModelKey 注释但我还没有在视图模型中进行任何注入,我会尝试做一个
  • 即使你不需要在你的视图模型中注入任何东西,你仍然需要用@Inject注释构造函数以便Dagger找到它。
  • 那么,进展如何?你试过了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2021-05-05
  • 2021-06-11
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
相关资源
最近更新 更多