Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Jetpack Compose:管理共享UI状态_Android_Android Jetpack Compose - Fatal编程技术网

Android Jetpack Compose:管理共享UI状态

Android Jetpack Compose:管理共享UI状态,android,android-jetpack-compose,Android,Android Jetpack Compose,我的第一个问题是,这样做是否正确 对于第二个问题,我觉得我在上一个屏幕中设置的值应该由当前屏幕负责。所以我试着这样做 Screen.B->{ //就在这里------------------- 活跃的{ title=“屏幕B” 动作={ 图标按钮(onClick={}){ 图标(资产=Icons.Sharp.Home) } } } //就在这里------------------- 我的屏幕( name=“B”, buttonName=“到屏幕C”, onNext={ currentScr

我的第一个问题是,这样做是否正确

  • 对于第二个问题,我觉得我在上一个屏幕中设置的值应该由当前屏幕负责。所以我试着这样做

  • Screen.B->{
    //就在这里-------------------
    活跃的{
    title=“屏幕B”
    动作={
    图标按钮(onClick={}){
    图标(资产=Icons.Sharp.Home)
    }
    }
    }
    //就在这里-------------------
    我的屏幕(
    name=“B”,
    buttonName=“到屏幕C”,
    onNext={
    currentScreen=Screen.C
    }
    )
    
    }
    我想这个问题可以通过使用Jetpack导航来解决

    也许这篇文章能帮你


    欢迎链接到某个解决方案,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及它为什么在那里,然后引用您链接到的页面最相关的部分,以防目标页面不可用。
    typealias Actions = @Composable () -> Unit
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                SampleAppTheme {
                    var currentScreen by remember { mutableStateOf(Screen.A) }
                    var title by remember { mutableStateOf("Screen A") }
                    var action by remember { mutableStateOf<Actions>({}) }
                    
                    Scaffold(
                         topBar = {
                            TopAppBar(
                                title = {
                                    Text(title)
                                },
                                actions = {
                                    action()
                                }
                            )
                        }
                     ) {
                        Crossfade(current = currentScreen) { screen ->
                             when (screen) {
                                 Screen.A -> {
                                    MyScreen(
                                        name = "A",
                                        buttonName = "to Screen B",
                                        onNext = {
                                            currentScreen = Screen.B
                                            title = "Screen B"
                                            action = {
                                                 IconButton(onClick = {}) {
                                                    Icon(asset = Icons.Sharp.Home)
                                                }
                                            }
                                        }
                                    )
                                }
                                Screen.B -> {
                                    MyScreen(
                                        name = "B",
                                        buttonName = "to Screen C",
                                        onNext = {
                                            currentScreen = Screen.C
                                            title = "Screen B"
                                            action = {
                                                IconButton(onClick = {}) {
                                                    Icon(asset = Icons.Sharp.Close)
                                                }
                                            }
                                        }
                                    )
                                }
                                Screen.C -> {
                                    MyScreen(
                                        name = "C",
                                        buttonName = "to Screen A",
                                        onNext = {
                                            currentScreen = Screen.A
                                            title = "Screen A"
                                            action = {}
                                        }
                                    )
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    enum class Screen {
        A, B, C
    }
    
    @Composable
    fun MyScreen(
        name: String,
        buttonName: String,
        onNext: () -> Unit,
    ) {
        Column(
            Modifier.fillMaxSize().padding(24.dp),
        ) {
            Text(
                modifier = Modifier.weight(1f),
                text = "I am in screen $name!",
                textAlign = TextAlign.Center,
                style = MaterialTheme.typography.h3
            )
            Button(
                modifier = Modifier.fillMaxWidth(),
                onClick = onNext
            ) {
                Text(text = buttonName)
            }
        }
    }
    
    MyScreen(
        name = "B",
        buttonName = "to Screen C",
        onNext = {
            currentScreen = Screen.C
            title = "Screen B"
            // This right here!!!! -------------------
            action = { 
                IconButton(onClick = {}) {
                    Icon(asset = Icons.Sharp.Close)
                }
            }
            // This right here!!!! -------------------
        }
    )