首页 > 解决方案 > 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)
        }
    }
}

文件夹结构

问题

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

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

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

标签: android-jetpack-compose

解决方案


好吧,我想我找到了自己的答案,那就是,我不能思考旧式风格并使用新式工具。这意味着我需要将注意力转移到 MVVM 并遵循 Google 的指导方针,而不是考虑 OOP:

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


推荐阅读