android - 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
}
但它没有按预期工作,这意味着单击按钮时没有任何反应(可以通过断点调试来保证)。我想知道我哪里出错或误解了。谢谢你。
解决方案
推荐阅读
- python - Django 中类似 Youtube 的视频功能
- performance - 优化 SLURM 集群的性能
- flutter - 半径问题何时可能等于空
- apache-kafka - Kafka Group coordinator 10.*.*.*:9092 (id: 2768927897 rack: null) 不可用或无效,将尝试重新发现。在消费者中收到此错误
- laravel - Docker Laravel - 无法以附加模式打开:无法打开流:权限被拒绝
- java - 两个 Java 版本在团队协作中可能会发生冲突?
- django - 如何阻止数据库在生产中更新
- selenium - selenium webdriver find_element_by_xpath
- sqlite - Python 和 SQlite3
- ios - 子类化 UIControl 时创建自定义段控件的奇怪问题