man*_*ool 5 java android dependency-injection viewmodel dagger-2
我正在尝试像在这个例子中那样创建一个 viewmodel 模块,但我遇到了这个错误
错误:java.util.Map,javax.inject.Provider> 不能在没有 @Provides-annotated 方法的情况下提供。
我遵循了所有示例,这是我的代码
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);
}
}
}Run Code Online (Sandbox Code Playgroud)
ViewModelModule 类
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
}Run Code Online (Sandbox Code Playgroud)
这是组件
@Singleton
@Component(modules = {AppModule.class, ViewModelModule.class})
public interface MainComponent {
void inject(Sdk sdk);
void injectTestActivity(TestActivity testActivity);
}Run Code Online (Sandbox Code Playgroud)
ps:android库中的这个实现不在应用程序项目中
您需要使用 Dagger多重绑定来绑定视图模型。换句话说,绑定视图模型并使用@IntoMap多重绑定注释来注释它们。在您发布的同一示例中,您可以在此处找到一个示例。在示例中,他们创建了ViewModelKey注释,以便指定 Dagger 可以从地图中检索视图模型的键(通常是视图模型的类)。Dagger 将在编译时创建映射,这就是您收到错误的原因 - 如果您没有指定任何视图模型作为映射的一部分,Dagger 无法知道它应该实例化哪些类型。
| 归档时间: |
|
| 查看次数: |
2221 次 |
| 最近记录: |