首页 > 解决方案 > Koin 在片段与其宿主活动之间的 SharedViewModel

问题描述

我想通过使用 ViewModel(以下:使用 ViewModel共享数据)在共享 LiveData 更改时更新活动的 UI来实现片段与其宿主活动之间的通信。

从在模块中声明 ViewModel 开始

主模块.kt

object MainModule {
    val module = module {
        viewModel {
            MainViewModel()
        }
    }
}

然后将其注入活动和片段

MainActivity.kt

private val mainViewModel by viewModel<MainViewModel>()

主要片段.kt

private val mainViewModel by sharedViewModel<MainViewModel>()

观察LiveData在activity上的变化

MainActivity.kt

mainViewModel.drawerState.observe(this, {
    // do something when it changed
})

单击按钮(在片段上)时更新 LiveData

主要片段.kt

mainButton.setOnClickListener {
    mainViewModel.toggleDrawerState()
}

ViewModel 中的 LiveData 声明

主视图模型.kt

private val _drawerState = MutableLiveData<DrawerState>()
val drawerState: LiveData<DrawerState> = _drawerState

fun toggleDrawerState() {
    if (_drawerState.value == DrawerState.OPENED) {
        _drawerState.value = DrawerState.CLOSED
    } else {
        _drawerState.value = DrawerState.OPENED
    }
}

抽屉状态.kt

enum class DrawerState {
    CLOSED, OPENED
}

但它没有按预期工作,这意味着单击按钮时没有任何反应(可以通过断点调试来保证)。我想知道我哪里出错或误解了。谢谢你。

标签: androidandroid-fragmentsandroid-activityandroid-livedata

解决方案


推荐阅读