当前位置: 首页 > 知识库问答 >
问题:

Jetpack Compose - 可变范围/最佳实践

邵宜年
2023-03-14

我是Android Native编码(Kotlin / Jetpack Compose)的新手,在AS3移动应用程序编码(OOP)方面有着悠久的背景。我喜欢遵循相同的路径,并将可组合代码分解为更小的块,OOP,使其易于维护。

例如,这是主活动:

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)
        }
    }
}

文件夹结构

问题:

  • 我是否可以/应该在主可组合项(即MakeHome)中分配变量,然后从子可组合项访问这些变量

例如,在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}") {...}
}

我应该在哪里分配这些Vars?从一开始就构建代码整洁的“最佳”实践是什么。

有一些变通方法,例如将所有变量保存在数据类中,并从任何地方访问这些变量,我认为这是不对的。那么,请问最好的方法是什么?

共有1个答案

易和怡
2023-03-14

嗯,我想我找到了自己的答案,那就是,我不能思考旧的风格和使用新的工具。这意味着我不需要考虑面向对象编程,而需要将注意力转向MVVM,并遵循谷歌的指导方针:

https://developer.android.com/jetpack/guide

 类似资料:
  • 问题内容: 这是来自GOPL的示例-“表达式x [i]和x +’A’-‘a’分别引用外部块中x的声明;我们稍后将对此进行解释。” 解释永远不会到来。为什么x [i]引用外部范围中的x?只要在内部块中重新声明x,它就应该在外部块中遮盖x。为什么这样做? http://play.golang.org/p/NQxfkTeGzA 问题答案: 运算符创建一个新变量,并为其分配右侧值。 在for循环的第一个迭

  • 本章介绍当模板在访问变量时发生了什么事情,还有变量是如何存储的。 当调用 Template.process 方法时,它会在方法内部创建一个 Environment 对象,在 process 返回之前一直使用。 该对象存储模板执行时的运行状态信息。除了这些,它还存储由模板中指令,如 assign, macro, local 或 global 创建的变量。 它不会尝试修改传递给 process 的数据

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 这将编译 这不会 我希望两者都能编译(也许这是C的工作方式?)。是什么原因导致无法在外部块中以相同的名称声明一个块中的变量? 问题答案: 简短的答案是:因为这是JLS§6.4中定义Java语言的方式。 您可能从其他语言中使用过,因此允许使用所谓的可变阴影。但是,Java语言的发明者认为这是一个笨拙的功能,他们不希望使用其语言: 此限制有助于检测其他一些非常模糊的错误。 但是,正如作者在

  • 我对Oracle相当陌生,但已经进行了很好的搜索。有人能解释一下与此相关的范围规则吗: 错误: 错误报告-ORA-06550:第17行,第55列:PLS-00201:标识符“VARIABLE2”必须声明ORA-06550:第17行,第17列:PL/SQL:忽略语句06550。00000-“第%s行第%s列:\n%s”*原因:通常是PL/SQL编译错误*行动: 为什么在我第二次尝试输出它时Varia