Android Koin在片段及其宿主活动之间的SharedViewModel

Android 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

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

从模块中的declare ViewModel开始

main模块.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
}
然后将其注入活动和片段

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。