![](/img/trans.png)
[英]What is the best practice using dp and sp dimensions in Jetpack Compose?
[英]Best practice to implement startActivity using ViewModel in Jetpack Compose
例如,我有這個簡單的 Composable function
@Composable
fun TextExample(model: SomeViewModel = viewModel()) {
TextButton(onClick = { model.onClick() }) {
Text(text = "Test")
}
}
某些視圖模型:
class SomeViewModel : ViewModel() {
private val _text = mutableStateOf("Test")
val text: String
get() = _text.value
fun onClick() {
if (text.isEmpty()) {
// TODO: need to start some activity
} else {
_text.value = ""
}
}
}
我單擊此按鈕,然后 model 必須處理此單擊。 在某些情況下,我需要開始另一項活動。 什么是正確的方法來做到這一點?
可能有更好的方法,但你可以考慮我的。
我建議首先使用這樣的Sealed Class
為“一次性事件”創建數據結構
sealed class Events {
object ToActivityA: Events()
object ToActivityB: Events()
data class ToastMessage(val message: String): Events()
}
在您的 ViewModel 中聲明一個將發出這些事件的SharedFlow
private val _events = MutableSharedFlow<Events>()
val events: SharedFlow<Events> = _events
在您的情況下,從您的 onClick viewmodel function 發出一個事件,如下所示
fun onClick() {
if (text.isEmpty()) {
viewModelScope.launch {
_events.emit(Events.ToActivityA) // or ToActivityB, or for a Toast
}
} else {
_text.value = ""
}
}
現在在您的可組合項中,只需像這樣在LaunchedEffect
中觀察它
LaunchedEffect(key1 = Unit) {
viewModel.events.collectLatest {
when (it) {
Events.ToActivityA -> {
// to activity A
}
Events.ToActivityB -> {
// to activity B
}
is Events.ToastMessage -> {
// show toast message
}
}
}
}
如果您還沒有准備好調用 startActivity,我建議您訪問這篇文章作為參考。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.