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

问题描述 投票:0回答:1

我正在尝试使以下变量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 mutable jetpack composable mutablestateof
1个回答
0
投票

您可以使用 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 表达式放入由屏幕键入的映射中。

© www.soinside.com 2019 - 2024. All rights reserved.