mht*_*ani 11 android dependency-injection mvvm dagger android-viewmodel
有两个片段:ParentFragment和ChildFragment.
ChildFragment已被添加到视图中ParentFragment.
现在使用Dagger2Android有ParentFragmentModule一个方法:
@Provides
fun provideViewModel(fragment: ParentFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)
其中MyViewModelFactory,MyViewModel,MyViewModelImpl是在应用程序中创建的简单ViewModel逻辑.
并且ChildFragmentModule具有以下方法:
@Provides
fun provideViewModel(fragment: ChildFragment, myViewModelFactory: MyViewModelFactory): MyViewModel {
return ViewModelProviders.of(fragment, myViewModelFactory).get(MyViewModelImpl::class.java)
}
Run Code Online (Sandbox Code Playgroud)
这显然是创建两个单独的实例,ViewModel因为它们接收两个不同的片段实例.
我们如何使它返回相同的实例,以便可以在Parent和Child片段之间共享数据?
我试过传递ParentFragment而不是ChildFragment在ChildFragmentModule,但这导致Dagger依赖注入错误.
Abu*_*suf 20
创建您ViewModel的Activity范围.然后,所有Fragment内Activity会得到相同的ViewModel实例.
查看官方ViewModelProviders参考.您可以ViewModel使用both Activity和Fragmentscope 创建.
ViewModelProvider of (FragmentActivity activity)
Run Code Online (Sandbox Code Playgroud)
创建一个ViewModelProvider,它在给定Activity的作用域存活时保留ViewModels.更详细的解释在ViewModel中.
和
ViewModelProvider of (Fragment fragment)
Run Code Online (Sandbox Code Playgroud)
创建一个ViewModelProvider,它在给定片段的作用域存活时保留ViewModels.更详细的解释在ViewModel中.
用于创建的示例代码 ViewModel
来自活动:
movieListViewModel = ViewModelProviders.of(this).get(MovieListViewModel.class);
Run Code Online (Sandbox Code Playgroud)
来自片段:
movieListViewModel = ViewModelProviders.of(getActivity()).get(MovieListViewModel.class);
Run Code Online (Sandbox Code Playgroud)
Alo*_*hra 14
使用Fragment-ktx我们可以这样做In **ParentFragment**
private val viewModel: DemoViewModel by viewModels()
Run Code Online (Sandbox Code Playgroud)
和
In ChildFragment
private val viewModel: DemoViewModel by viewModels(
ownerProducer = { requireParentFragment() }
)
Run Code Online (Sandbox Code Playgroud)
这样做我们可以在Parent Fragment和ChildFragment 中获得相同的ViewModel实例
在应用程序中添加依赖项-> build.gralde
implementation 'androidx.fragment:fragment-ktx:1.1.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5969 次 |
| 最近记录: |