问题描述
我有一个关于android中的匕首的初学者级别的问题。请查看摘要以快速掌握。
目的是通过依赖注入在我的视图模型类中提供CentralRepo实例。
说,我有以下具有依存关系的类,
Myviewmodel -> ctor( //initing.. mCentralRepo = CentralRepo.getInstance(RemoteRepo.getInstance) );
CentralRepo -> cror (@para RemoteRepo)
现在,这些是我的模块类
-
MyRemoteRepositoyModule
@Module public class MyRemoteRepositoryModule { /** * Method to provide an instance of {@link RemoteRepository} * * @return RemoteRepository. */ @Singleton @Provides RemoteRepository provideRemoteRepository() { return RemoteRepository.getInstance(); } }
-
MyCentralRepositoryModule
@Module public class MyCentralRepositoryModule { private RemoteRepository mRemoteRepository; public MyCentralRepositoryModule(RemoteRepository remoteRepository) { mRemoteRepository = remoteRepository; } /** * Method to provide an instance of {@link CentralRepository} * * @return MyCentralRepository. */ @Singleton @Provides MyCentralRepository provideMyCentralRepository() { return MyCentralRepository.getInstance(mRemoteRepository); } }
-
最后是组件类(IMyComponent)
@Singleton @Component(modules = {MyRemoteRepositoryModule.class,MyCentralRepositoryModule.class}) public interface IMyComponent { /** * targeting injection in VM. */ public void injectInviewmodel(MyAndroidviewmodel viewmodel); }
和应用程序类
public class MyApplication extends Application {
private IMyComponent mComponent;
@Override
public void onCreate() {
super.onCreate();
// doubtful?
mComponent = DaggerIMyComponent.builder().myRemoteRepositoryModule(new MyRemoteRepositoryModule()).build();
//
}
}
现在,如果我尝试将其注入到视图模型类中 我遇到了错误
必须设置MyCentralRepositoryModule
我确信我错过了一些东西,如果您能指出错误,将不胜感激。
解决方法
您的IMyComponent
定义您将只将这些模块注入MyAndroidViewModel
中,并且您将在Application上下文中构建组件。现在有两种可能性。
1-将组件方法的参数从MyAndroidViewModel
更改为Application
@Singleton
@Component(modules = {
MyRemoteRepositoryModule.class,MyCentralRepositoryModule.class
})
public interface IMyComponent {
public void injectInViewModel(Application application);
}
然后使用此块
DaggerIMyComponent.builder().myCentralRepositoryModule(new MyRemoteRepositoryModule()).build().injectInViewModel(this);
2-或通过在类中添加以下代码在MyAndroidViewModel
中构建组件
init{
DaggerIMyComponent.builder().myCentralRepositoryModule(new MyRemoteRepositoryModule()).build().injectInViewModel(this);
}