我正在使用Android的ViewModel lib,我想在一个ViewModel中注入一个Navigator,它位于App的范围内,但我的导航器依赖于活动。我不知道如何注射它。我将复制并粘贴一些文件,但我的项目可以找到here,我提到的文件位于'app / src / main / java / app / vehiclemonitor /'+'app /'或'viewmodel'或'feature / home'
VmAppComponent.java
@Singleton
@Component(modules = {VMAppModule.class, VMApiServiceModule.class, SchedulerModule.class, ViewModelModule.class})
public interface VMAppComponent {
void inject(VMApp app);
HomeActivityComponent injectHomeActivity(BaseActivityModule module);
AddEditVehicleActivityComponent injectAddEditVehicleActivity(BaseActivityModule module);
}
ViewModelModule.class
@Module
public abstract class ViewModelModule {
@Binds
@IntoMap
@ViewModelKey(HomeViewModel.class)
abstract ViewModel bindHomeViewModel(HomeViewModel homeViewModel);
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
}
public class HomeViewModel extends ViewModel {
@NonNull
private HomeNavigator navigationProvider;
@NonNull
private BaseSchedulerProvider schedulerProvider;
@Inject
public HomeViewModel(@NonNull final BaseSchedulerProvider schedulerProvider) {
this.schedulerProvider = schedulerProvider;
}
// @Inject
// public HomeViewModel(@NonNull HomeNavigator navigationProvider, @NonNull BaseSchedulerProvider schedulerProvider) {
// this.navigationProvider = navigationProvider;
// this.schedulerProvider = schedulerProvider;
// }
void handleAddButtonClick() {
navigationProvider.addNewVehicle();
}
public void setNavigationProvider(final HomeNavigator navigationProvider) {
this.navigationProvider = navigationProvider;
}
}
答案 0 :(得分:2)
首先,这是一个很好的问题,很多开发人员都有同样的问题,目前还没有正式的解决方案。
唯一可靠的是:
ViewModel
一般不应引用活动或视图。
你应该做的是阅读GitHub https://github.com/googlesamples/android-architecture-components/issues/63中的所有这个帖子,已经发布了很多解决方案,而且至少有一个好处可供你使用。
关于您在googlesamples and blueprint上发布的链接,他们的Navigator
并不是您想象中的好消息。它仍然是一个示例应用程序,可能它们删除了一些复杂性,使样本更容易理解为更广泛的开发人员。
我认为更好的方法是this sample repo中提供的方法,它完全删除对活动的引用。 (它是在Kotlin中制作的,我不知道你是否可以用Java模拟相同的行为,但你至少可以尝试。)