簡體   English   中英

在 Jetpack Compose 中使用 ViewModel 實現 startActivity 的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM