iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Mobile Development

從零開始學習 Jetpack Compose系列 第 20

從零開始學習 Jetpack Compose Day19 - Compose 搭配 ViewModel

  • 分享至 

  • xImage
  •  

昨天我們提到狀態管理時介紹了 remembermutableStateOf,但在實際開發中,情況往往更加複雜。比如說,專案採用的是 MVVM 架構,那麼如何與 ViewModel 進行溝通或訂閱就變得尤為重要。

ViewModel:負責處理業務邏輯、管理以及儲存與UI相關的資料並且會跟隨畫面生命週期。

要在 Compose 裡面使用 ViewModel 首先要新增依賴

libs.versions.toml

androidx-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version = "2.8.6"}

build.gradle.kts

dependencies {
		.
		.
    implementation(libs.androidx.viewmodel)
		.
		.
}

接下來,我們對昨天的程式進行調整,首先建立一個 ViewModel。在 ViewModel 中,我們使用 StateFlow 與 Compose 結合。因此,定義了兩個 StateFlow 參數:一個用來接收輸入框的變化,另一個負責通知 Text 顯示對應的文字。此外,還建立了兩個對外的方法,一個用來接收輸入框的輸入變化,另一個用來處理按鈕點擊事件。

class MainViewModel : ViewModel() {

    val name: StateFlow<String>
        get() = mName
    val text: StateFlow<String>
        get() = mText

    private var mName = MutableStateFlow("")
    private var mText = MutableStateFlow("")

    fun login() {
        mName.value = mText.value
    }

    fun setText(text: String) {
        mText.value = text
    }
}

在畫面中,我們新增了 ViewModel 參數,並將原本使用的 remember 改為透過 ViewModel 使用 collectAsState 來接收資料變化。

@Composable
fun Greeting(viewModel: MainViewModel = viewModel(), name: String, modifier: Modifier = Modifier) {
    val name by viewModel.name.collectAsState()
    val text by viewModel.text.collectAsState()
    Column(
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
    ) {
        Text(
            text = "Hello! ${name}",
            modifier = Modifier.padding(bottom = 8.dp),
            style = MaterialTheme.typography.bodyMedium
        )
        OutlinedTextField(
            value = text,
            onValueChange = {
                viewModel.setText(it)
            },
            label = { Text("Name") }
        )
        Button(
            onClick = {
                viewModel.login()
            }
        ) {
            Text("Login")
        }
    }
}

https://raw.githubusercontent.com/jian-fu-hung/ithelp-2024/refs/heads/main/Images/Day19/%E6%88%AA%E5%9C%96%202024-10-04%20%E6%99%9A%E4%B8%8A11.37.08.png

https://raw.githubusercontent.com/jian-fu-hung/ithelp-2024/refs/heads/main/Images/Day19/%E6%88%AA%E5%9C%96%202024-10-04%20%E6%99%9A%E4%B8%8A11.37.17.png


上一篇
從零開始學習 Jetpack Compose Day18 - 狀態管理
下一篇
從零開始學習 Jetpack Compose Day20 - Compose中使用傳統View
系列文
從零開始學習 Jetpack Compose30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言