我设法解决了这个问题,依赖性问题就在这一行
@Binds
abstract PresenterFactory bindsPresenterFactory(PresenterFactory viewModelFactory);
在这里,我需要返回一个引用并提供该引用的具体实现者。
工作变化如下:
public interface PresenterFactory {
/**
* Creates a new instance of the given {@code Class}.
* <p>
*
* @param modelClass a {@code Class} whose instance is requested
* @param <T> The type parameter for the ViewModel.
* @return a newly created ViewModel
*/
@NonNull
<T extends PresenterClass> T create(@NonNull Class<T> modelClass);
}
具体实施者
@Singleton
public class PresenterFactoryImpl implements PresenterFactory {
private final Map<Class<? extends PresenterClass>, Provider<PresenterClass>> creators;
@Inject
public PresenterFactoryImpl(Map<Class<? extends PresenterClass>, Provider<PresenterClass>> creators) {
this.creators = creators;
}
@SuppressWarnings("unchecked")
@Override
public <T extends PresenterClass> T create(Class<T> modelClass) {
Provider<? extends PresenterClass> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends PresenterClass>, Provider<PresenterClass>> 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) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
PresenterModule
@Module
public abstract class PresenterModule {
@Binds
@IntoMap
@PresenterKey(AuthPresenterImpl.class)
abstract PresenterClass bindsAuthPresenterImpl(AuthPresenterImpl authViewModel);
@Binds
abstract PresenterFactory bindsPresenterFactory(PresenterFactoryImpl viewModelFactory);
}