android-jetpack-compose - Jetpack Compose - 可变范围/最佳实践
问题描述
我是 Android 本机编码 (Kotlin / Jetpack Compose) 的新手,在 AS3 移动应用程序编码 (OOP) 方面有很长的背景。我喜欢遵循相同的路径并将可组合代码分解成更小的块,OOP,以便于维护。
例如,这是 MainActivity:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MakeNav()
}
}
}
@Composable
fun MakeNav() {
var navCon = rememberNavController()
NavHost(navController = navCon, startDestination = "home") {
composable("home") {
MakeHome(navCon)
}
composable("list") {
MakeList()
}
}
}
并撰写主页:
@Composable
fun MakeHome(navCon: NavController){
Box(
modifier = Modifier
.fillMaxSize()
){
Column() {
MakeHomeHdr()
MakeHomeBdy()
MakeHomeFtr(navCon)
}
}
}
问题:
- 我可以/我应该在 Mother Composable (即MakeHome)中分配变量,然后从 Sub-Composable 访问这些变量吗?
例如,在MakeHomeBdy()中,我有 3 个变量需要稍后传递给 NavHost:
var txtSub by rememberSaveable { mutableStateOf("Call Mr. X")}
var txtDte by rememberSaveable { mutableStateOf("1400/05/21")}
var txtTme by rememberSaveable { mutableStateOf("10:01")}
Column (
modifier = Modifier
.padding(30.dp)
){
TextField(
value = txtSub,
onValueChange = { txtSub = it },
placeholder = { Text("some text") },
modifier = Modifier
.fillMaxWidth()
)
...
单击MakeHomeFtr()中的按钮时,我需要传递数据:
@Composable
fun MakeHomeFtr(navCon: NavController){
Row(
horizontalArrangement = Arrangement.End,
verticalAlignment = Alignment.Bottom,
modifier = Modifier.fillMaxSize()
) {
FloatingActionButton(
onClick = {navCon.navigate("list")},
modifier = Modifier
.padding(30.dp)
) {
Icon(Icons.Filled.Add, contentDescription = "Add")
}
}
}
在此示例中,我无法访问MakeHomeBdy ()中的变量以将它们传递给 NavHost:
NavHost(startDestination = "home") {
...
composable("list/{txtSub}/{txtDte}/{txtTme}") {...}
}
我应该在哪里分配这些变量?从一开始就构建整洁干净的代码的“最佳”实践是什么。
有一些变通方法,例如将所有变量保存在数据类中,并从任何地方访问这些变量,我认为这是不正确的。那么请问最好的方法是什么?
解决方案
好吧,我想我找到了自己的答案,那就是,我不能思考旧式风格并使用新式工具。这意味着我需要将注意力转移到 MVVM 并遵循 Google 的指导方针,而不是考虑 OOP:
推荐阅读
- c# - 如何在 oAuth 2.0 - C# 中跳过用户同意并直接获取访问令牌
- arrays - 如何将这些单独的标签压缩为自定义 UICollectionView 单元格中的标签数组?
- asp.net-core - 角色/用户在 ASP.Net.Core.Identity 中可以拥有多少个声明?
- linux - linux中的“-Dprefix”有什么作用?
- python - 列表的居中平均值
- python - 如何尝试创建日期对象并将无效参数设置为 1?
- javascript - 下划线符号更改变量的可访问性
- python - Zabbix Action - 如何在自定义脚本中使用默认字段
- azure - 有没有办法以编程方式启用 Azure 的 management-api 内置 rest API?
- python - ValueError:不一致的形状:锯(1152、10、1、10、16)但预期(1152、10、1、16)