提问人:J. Edgell 提问时间:8/15/2023 最后编辑:AbhimanyuJ. Edgell 更新时间:10/30/2023 访问量:61
在 Jetpack Compose 中使回调函数变量可变的语法是什么?
What is the syntax to make a callback function variable mutable in Jetpack Compose?
问:
我正在尝试使以下变量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() }
}
}
}
任何协助将不胜感激。
答:
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() })
}
(注意 - 约定是函数以@Composable
UpperCamelCase
)
我明白你在这里想做什么,但问题是处理配置更改。跟踪里面的 lambda ,它会在配置更改(例如屏幕旋转)时丢失并重新初始化。CurrentView
最好将当前屏幕作为简单值(字符串、对象、枚举等)作为视图模型(使用保存的状态处理程序)中的屏幕标识符进行跟踪,或者至少在 .rememberSaveable
然后,您可以在屏幕上定义一个标识符来选择要调用的标识符,或者将 lambda 放在由屏幕标识符键控的映射中。when
@Composable
评论
1赞
J. Edgell
8/15/2023
你的解决方案对我有用,谢谢!我会研究你的其他建议,我非常了解 SwiftUI,而且我刚刚开始使用 JetPack Compose,所以我确信我的方法会陷入一些错误的兔子洞。谢谢你的建议!
评论