我正在尝试使以下变量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() }
}
}
}
如有任何帮助,我们将不胜感激。
您可以使用 Compose 可变状态来保存它。类似的东西
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
...
var selectedView by remember {
mutableStateOf<@Composable () -> Unit>({ TestView() })
}
(注意 - 惯例是
@Composable
函数以 UpperCamelCase
命名)
我明白你想在这里做什么,但问题是处理配置更改。跟踪
CurrentView
内的 lambda,它会在配置更改(例如屏幕旋转)时丢失并重新初始化。
最好将当前屏幕作为视图模型(带有保存的状态处理程序)内的简单值(字符串、对象、枚举等)或至少在
rememberSaveable
中)进行跟踪。
然后,您可以定义一个
when
来选择要调用的 @Composable
,或者将 lambda 表达式放入由屏幕键入的映射中。