在 Jetpack Compose 中使回调函数变量可变的语法是什么?

What is the syntax to make a callback function variable mutable in Jetpack Compose?

提问人:J. Edgell 提问时间:8/15/2023 最后编辑:AbhimanyuJ. Edgell 更新时间:10/30/2023 访问量:61

问:

我正在尝试使以下变量selectedView可变,以便我可以动态设置当前的可组合视图。

var selectedView :@Composable () -> Unit =  { testView() }

我正在传回 Composable 函数并且以下代码有效,但我无法弄清楚如何使变量 selectedView 可更新。如果 selectedView 变量是可变的,这将起作用。

@Composable
fun testView1() {
    Text("It works! 111")
}

...
    
val navBarItems = listOf(
    NavBarItem("Invite", Icons.Outlined.Send) { testView1() },
    NavBarItem("Messages", Icons.Outlined.Menu) { testView2() },
    NavBarItem("Groups", Icons.Outlined.AccountCircle) { testView3() }
)

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun CurrentView() {
    
    var selectedView :@Composable () -> Unit =  { testView() }

    Scaffold(
        bottomBar = {
            CustomNavBar(navBarItems){
                selectedView  = it
            }
        }
    )
    {
        Box(modifier = Modifier
            .fillMaxSize()
            .padding(it), contentAlignment = Alignment.Center) {
            selectedView?.let { it1 -> it1() }
        }
    }
}

任何协助将不胜感激。

Android 可变可 组合 mutablestateof

评论


答:

0赞 Scott Stanchfield 8/15/2023 #1

您可以使用 Compose 可变状态来保存它。类似的东西

import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
...
var selectedView by remember {
    mutableStateOf<@Composable () -> Unit>({ TestView() })
}

(注意 - 约定是函数以@ComposableUpperCamelCase)

我明白你在这里想做什么,但问题是处理配置更改。跟踪里面的 lambda ,它会在配置更改(例如屏幕旋转)时丢失并重新初始化。CurrentView

最好将当前屏幕作为简单值(字符串、对象、枚举等)作为视图模型(使用保存的状态处理程序)中的屏幕标识符进行跟踪,或者至少在 .rememberSaveable

然后,您可以在屏幕上定义一个标识符来选择要调用的标识符,或者将 lambda 放在由屏幕标识符键控的映射中。when@Composable

评论

1赞 J. Edgell 8/15/2023
你的解决方案对我有用,谢谢!我会研究你的其他建议,我非常了解 SwiftUI,而且我刚刚开始使用 JetPack Compose,所以我确信我的方法会陷入一些错误的兔子洞。谢谢你的建议!