如果没有 @Provides 注释的方法,则无法提供 >

2023-12-14

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

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

我遵循了所有示例,这是我的代码

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 绑定视图模型多重绑定。换句话说,绑定您的视图模型并用@IntoMap多重绑定注释。在您发布的同一示例中,您可以找到一个示例here。在示例中,他们创建了ViewModelKey注解以指定 Dagger 可以从地图检索视图模型的键(通常是视图模型的类)。 Dagger 将在编译时创建映射,这就是您收到错误的原因 - 如果您没有指定任何视图模型作为映射的一部分,Dagger 无法知道它应该实例化哪些类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果没有 @Provides 注释的方法,则无法提供 > 的相关文章

随机推荐