小编mht*_*ani的帖子

如何将同一个ViewModel实例同时提供给Parent和Child片段

有两个片段: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而不是ChildFragmentChildFragmentModule,但这导致Dagger依赖注入错误.

android dependency-injection mvvm dagger android-viewmodel

11
推荐指数
2
解决办法
5969
查看次数

未观察到多次调用以设置LiveData

我最近看到了一个奇怪的问题,它正在阻碍我的项目。多次调用以设置实时数据值不会调用视图中的观察者。

似乎只有最后设置的值才实际调用视图中的Observer。

这是评论的代码段。

MainActivity.kt

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)

MainViewModel.kt

abstract class MainViewModel : ViewModel() {

    sealed class State {
        data …
Run Code Online (Sandbox Code Playgroud)

android viewmodel kotlin android-livedata

5
推荐指数
3
解决办法
1825
查看次数