如何在SavedStateHandle感知的AndroidViewModel中注入依赖项?

如何在SavedStateHandle感知的AndroidViewModel中注入依赖项?,android,dagger-2,android-architecture-components,android-architecture-lifecycle,Android,Dagger 2,Android Architecture Components,Android Architecture Lifecycle,假设视图模型如下所示: 公共类FooViewModel扩展了AndroidViewModel{ @注入公共FooViewModel(应用程序应用程序、SavedStateHandle句柄、工具栏){ // ... } } 我想用匕首2注射Bar。我正在Android上开发 根据报告: 如果希望在ViewModel的构造函数中接收此对象,则应使用SavedStateViewModelFactory 然而,工厂是final的状态意味着我也不能在那里注入Bar 到目前为止,我一直通过setter进行

假设视图模型如下所示:

公共类FooViewModel扩展了AndroidViewModel{
@注入公共FooViewModel(应用程序应用程序、SavedStateHandle句柄、工具栏){
// ...
}
}
我想用匕首2注射
Bar
。我正在Android上开发

根据报告:

如果希望在
ViewModel
的构造函数中接收此对象,则应使用
SavedStateViewModelFactory

然而,工厂是
final
的状态意味着我也不能在那里注入
Bar

到目前为止,我一直通过setter进行注射:

@提供
FooViewModel ProviderOviewModel(ViewModelStoreOwner,Bar){
FooViewModel viewModel=newviewmodelprovider(owner.get)(FooViewModel.class);
viewModel.立根杆(条形);
返回视图模型;
}
有更好的方法吗


我想使用构造函数注入,将
Bar
实例变量标记为
final
,并消除setter。

要提供
FooViewModel
,需要自定义
AbstractSavedStateViewModelFactory的实现

MyComponent component = DaggerMyComponent.withViewModelStoreOwner(this)
.withSavedStateRegistryOwner(this)
.withDefaultArguments(this.arguments != null ? this.arguments : new Bundle())
.build();

@提供
@抑制(“未选中的_CAST”)
公共MyViewModel viewModel(ViewModelStoreOwner ViewModelStoreOwner、SavedStaterRegistryOwner、SavedStaterRegistryOwner、绑定默认参数、应用程序应用程序、条形图){
返回新的ViewModelProvider(
viewModelStoreOwner,
新的AbstractSavedStateViewModelFactory(savedStateRegistryOwner,defaultArgs){
@凌驾
公众不能创造(
字符串键,
类模型类,
SavedStateHandle(句柄){
返回(T)新的MyViewModel(应用程序、句柄、条);
} 
}).get(MyViewModel.class);
});
}
注:

1.)您只能在
AbstractSavedStateViewModelFactory
中获取
SavedStateHandle
,因此无法将其放入图形中

2.)您可以使用减少该提供程序的长度。从理论上讲,汽车工厂也可以工作,但相比之下,它似乎没有得到维护

3.)您将无法在ViewModel上获取
@Inject


此答案部分改编自。

要回答此问题,我需要知道您是如何将ViewModelStoreOwner放入图形中的。@EpicPandaForce我使用了
@Subcomponent.Builder
@BindsInstance Builder以及ViewModelStoreOwner(ViewModelStoreOwner)方法。我用
和ViewModelStoreOwner(This)
调用我的片段。这回答了你的问题吗?发布的代码运行良好!注意:我没有尝试
AssistedInject
    @Provides
    @Suppress("UNCHECKED_CAST")
    public MyViewModel viewModel(ViewModelStoreOwner viewModelStoreOwner, SavedStateRegistryOwner savedStateRegistryOwner, Bundle defaultArgs, Application application, Bar bar) {
        return new ViewModelProvider(
            viewModelStoreOwner,
            new AbstractSavedStateViewModelFactory(savedStateRegistryOwner, defaultArgs) {
                @Override
                public <T extends ViewModel> T create(
                    String key,
                    Class<T> modelClass,
                    SavedStateHandle handle) {
                    return (T) new MyViewModel(application, handle, bar);
                } 
            }).get(MyViewModel.class);
        });
    }