Android Koin在片段及其宿主活动之间的SharedViewModel
我想通过使用ViewModel(如下:)在共享LiveData更改时更新活动的UI,实现片段与其宿主活动之间的通信 从模块中的declare ViewModel开始 main模块.ktAndroid Koin在片段及其宿主活动之间的SharedViewModel,android,android-fragments,android-activity,android-livedata,Android,Android Fragments,Android Activity,Android Livedata,我想通过使用ViewModel(如下:)在共享LiveData更改时更新活动的UI,实现片段与其宿主活动之间的通信 从模块中的declare ViewModel开始 main模块.kt object MainModule { val module = module { viewModel { MainViewModel() } } } private val mainViewModel by viewModel<Ma
object MainModule {
val module = module {
viewModel {
MainViewModel()
}
}
}
private val mainViewModel by viewModel<MainViewModel>()
private val mainViewModel by sharedViewModel<MainViewModel>()
mainViewModel.drawerState.observe(this, {
// do something when it changed
})
mainButton.setOnClickListener {
mainViewModel.toggleDrawerState()
}
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
}
}
enum class DrawerState {
CLOSED, OPENED
}
然后将其注入活动和片段
MainActivity.kt
object MainModule {
val module = module {
viewModel {
MainViewModel()
}
}
}
private val mainViewModel by viewModel<MainViewModel>()
private val mainViewModel by sharedViewModel<MainViewModel>()
mainViewModel.drawerState.observe(this, {
// do something when it changed
})
mainButton.setOnClickListener {
mainViewModel.toggleDrawerState()
}
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
}
}
enum class DrawerState {
CLOSED, OPENED
}
单击按钮(在片段上)时更新LiveData
MainFragment.kt
object MainModule {
val module = module {
viewModel {
MainViewModel()
}
}
}
private val mainViewModel by viewModel<MainViewModel>()
private val mainViewModel by sharedViewModel<MainViewModel>()
mainViewModel.drawerState.observe(this, {
// do something when it changed
})
mainButton.setOnClickListener {
mainViewModel.toggleDrawerState()
}
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
}
}
enum class DrawerState {
CLOSED, OPENED
}
LiveData在ViewModel中声明
MainViewModel.kt
object MainModule {
val module = module {
viewModel {
MainViewModel()
}
}
}
private val mainViewModel by viewModel<MainViewModel>()
private val mainViewModel by sharedViewModel<MainViewModel>()
mainViewModel.drawerState.observe(this, {
// do something when it changed
})
mainButton.setOnClickListener {
mainViewModel.toggleDrawerState()
}
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
}
}
enum class DrawerState {
CLOSED, OPENED
}
但它不能按预期工作,这意味着单击按钮时不会发生任何事情(可以通过使用断点进行调试来保证)。我想知道我哪里做错了或误解了。谢谢。当您在toggleDrawerState()上执行postValue(DrawerState.CLOSED)时是否也一样?哇,现在可以了。你能再给我解释一下吗?为什么它应该使用“postValue()”而不是“=”?我不确定,因为我不知道您的整个场景。也许,您的toggleDrawersState()在主线程之外做了一些事情。为了避免这种问题,我倾向于在处理LiveData时使用postValue。