Dagger2在视图模型中注入导航器

时间:2018-01-08 12:08:56

标签: android dagger-2

我正在使用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;
    }
}

1 个答案:

答案 0 :(得分:2)

首先,这是一个很好的问题,很多开发人员都有同样的问题,目前还没有正式的解决方案。

唯一可靠的是:

  

ViewModel 一般不应引用活动或视图。

你应该做的是阅读GitHub https://github.com/googlesamples/android-architecture-components/issues/63中的所有这个帖子,已经发布了很多解决方案,而且至少有一个好处可供你使用。

关于您在googlesamples and blueprint上发布的链接,他们的Navigator并不是您想象中的好消息。它仍然是一个示例应用程序,可能它们删除了一些复杂性,使样本更容易理解为更广泛的开发人员。

我认为更好的方法是this sample repo中提供的方法,它完全删除对活动的引用。 (它是在Kotlin中制作的,我不知道你是否可以用Java模拟相同的行为,但你至少可以尝试。)