ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用 Compose + ViewModel + Flow 进行 GUI 编程

2022-04-30 00:03:41  阅读:225  来源: 互联网

标签:Compose GUI onValueChange ViewModel value vm LeftText fun RightTextField


课题

  1. 程序界面由3个文本编辑框和1个文本标签组成。
  2. 要求文本标签实时显示3个文本编辑框所输入的数字之和。
  3. 文本编辑框输入的不是合法数字时,将其值视为0。
  4. 3个文本编辑框的初值分别为1,2,3。

创建工程

打开 Android Studio,File / New / Project...
在 New Project 向导的第1页,选择 Empty Compose Activity
在向导的第2页 Name 填上 Compose Example
在向导的第4页点击 Finish 按钮创建工程

ViewModel

在 com.example.composeexample 包中添加 NumbersViewModel 类

class NumbersViewModel : ViewModel() {
    val number1 = MutableStateFlow("1")
    val number2 = MutableStateFlow("2")
    val number3 = MutableStateFlow("3")
    val result = combine(number1, number2, number3) { n1, n2, n3 ->
        ((n1.toIntOrNull() ?: 0) + (n2.toIntOrNull() ?: 0) + (n3.toIntOrNull() ?: 0)).toString()
    }
}

配置 UI

打开 MainActivity.kt,将内容修改为

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ComposeExampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
                    AddNumbers()
                }
            }
        }
    }
}

@Composable
fun LeftText(
    text: String = "",
) {
    Text(
        text = text,
        modifier = Modifier.width(40.dp),
        textAlign = TextAlign.Center,
    )
}

@Composable
fun RightTextField(
    value: String,
    onValueChange: (String) -> Unit,
    readOnly: Boolean = false,
) {
    TextField(
        value = value,
        onValueChange = onValueChange,
        readOnly = readOnly,
        modifier = Modifier.width(200.dp),
        textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.End)
    )
}

@Composable
fun AddNumbers(vm: NumbersViewModel = NumbersViewModel()) {
    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {
        Row {
            LeftText()
            RightTextField(
                value = vm.number1.collectAsState().value,
                onValueChange = { vm.number1.value = it },
            )
        }
        Row {
            LeftText()
            RightTextField(
                value = vm.number2.collectAsState().value,
                onValueChange = { vm.number2.value = it }
            )
        }
        Row(verticalAlignment = Alignment.CenterVertically) {
            LeftText("+")
            RightTextField(
                value = vm.number3.collectAsState().value,
                onValueChange = { vm.number3.value = it }
            )
        }
        Row {
            LeftText()
            RightTextField(
                value = vm.result.collectAsState("").value,
                onValueChange = {},
                readOnly = true
            )
        }
    }
}

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    ComposeExampleTheme {
        AddNumbers()
    }
}

标签:Compose,GUI,onValueChange,ViewModel,value,vm,LeftText,fun,RightTextField
来源: https://www.cnblogs.com/zwvista/p/16209160.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有