有两个片段: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依赖注入错误.
我最近看到了一个奇怪的问题,它正在阻碍我的项目。多次调用以设置实时数据值不会调用视图中的观察者。
似乎只有最后设置的值才实际调用视图中的Observer。
这是评论的代码段。
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProviders.of(this).get(MainViewModelImpl::class.java)
viewModel.state().observe(this, Observer {
onStateChange(it!!)
})
viewModel.fetchFirstThree()
}
private fun onStateChange(state: MainViewModel.State) {
when (state) {
is One -> {
show(state.data)
}
is Two -> {
show(state.data)
}
is Three -> {
show(state.data)
}
}
}
private fun show(data: String) {
Log.d("Response", data)
}
}
Run Code Online (Sandbox Code Playgroud)
abstract class MainViewModel : ViewModel() {
sealed class State {
data …Run Code Online (Sandbox Code Playgroud)