我认为最好的方法是在 livedata/stateflow 延迟创建上使用 .also ,这样你就可以保证只要视图模型还活着,loadState 只会被调用一次,并且还保证服务本身不会被调用,除非有人在听。然后您从视图模型中收听状态,无需从启动效果中调用任何 api 调用,您的代码也会对特定状态做出反应。
这是一个代码示例
class MyViewModel : ViewModel() {
private val uiScreenState: : MutableStateFlow<WhatEverState> =
MutableStateFlow(WhatEverIntialState).also {
loadState()
}
fun loadState(): StateFlow<WhatEverState>> {
return users
}
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
使用此代码时,您根本不必在活动中调用 loadstate,您只需听观察者。
您可以查看以下代码进行收听
class MyFragment : Fragment {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
return ComposeView(requireContext()).apply {
setContent {
StartingComposeTheme {
Box(modifier = Modifier.fillMaxSize()) {
val state by viewModel.uiScreenState.collectAsState()
when (state) {
//do something
}
}
}
}
}
}
}}