用底部navbar在屏幕之间保存状态-Jetpac组成

发布于 2025-01-25 19:15:08 字数 3045 浏览 5 评论 0原文

如标题所建议的 - 我想保存屏幕元素的状态。也就是说,我想在屏幕A上切换一些东西,转到屏幕B,返回屏幕A,并在屏幕A中保存所有更改。我是Android开发的新手。据我了解,这种情况的解决方案之一是使用ViewModel。查看下面的代码。我试图用VM重写这件作品。

@Composable
fun DaysOfWeek(
    days: Int = 6,
    //viewModel: MyViewModel = MyViewModel()
){

    val states = remember{
        SnapshotStateList<Boolean>().also {
            for(day in 0..days){
                it.add(false)
            }
        }
    }
    
    val person = mutableListOf(0, 0, 0, 0, 0, 0, 0)
    val person1 = remember{ mutableStateOf(person) }
    /*val st = remember {
        viewModel.snap
    }*/

    Column() {
        Row(horizontalArrangement = Arrangement.SpaceEvenly){
            for(day in 0..days){
                DaysOfWeekContainer(
                    color = if (states[day]) Color.Green else Color.Transparent
                ){
                    DaysOfWeekButton(
                        onClick =
                        {
                            //viewModel.snapChanged(day)
                            states[day] = !states[day]
                            if(states[day]) person1.value.set(day, 1)
                            else person1.value.set(day, 0)
                        },
                        day = day
                    )
                }
            }
        }
        Spacer(modifier = Modifier.height(20.dp))
        Text("${person1.value}")
    }
}

VM:

class MyViewModel {
    //state
    var clicked by mutableStateOf(false)
    var color1 by mutableStateOf(Color.Transparent)
    var color2 by mutableStateOf(Color.Green)

    var rememem by mutableStateOf(
        SnapshotStateList<Boolean>().also {
            for(day in 0..6){
                it.add(false)
            }
        }
    )

    //events
    fun clickedChange(){clicked = !clicked}

    fun snapChanged(int: Int){
        rememem[int] = !rememem[int]
    }

}

我尝试了这一点,这就是工作!但是,当我在屏幕上的屏幕之间切换时,不会保存状态,

@Composable
fun DaysOfWeek(
    days: Int = 6,
    viewModel: MyViewModel = MyViewModel()
){
    
    val person = mutableListOf(0, 0, 0, 0, 0, 0, 0)
    val person1 = remember{ mutableStateOf(person) }

    Column() {
        Row(horizontalArrangement = Arrangement.SpaceEvenly){
            for(day in 0..days){
                DaysOfWeekContainer(
                    color = if(viewModel.rememem[day]) viewModel.color2 else viewModel.color1
                ){
                    DaysOfWeekButton(
                        onClick =
                        {
                            viewModel.snapChanged(day)
                            if(viewModel.rememem[day]) person1.value.set(day, 1)
                            else person1.value.set(day, 0)
                        },
                        day = day
                    )
                }
            }
        }
        Spacer(modifier = Modifier.height(20.dp))
        Text("${person1.value}")
    }
}

我有7个按钮,每次我单击其中一个按钮时,它们会更改颜色。 我该如何解决问题使用VM。屏幕上的状态更改,但切换屏幕时没有保存。

谢谢你!

As the title suggests - I want to save the states of screen elements. That is, I want to switch something on screen A, go to screen B, return to screen A and have all the changes in screen A saved. I am new to android development. As I understand it, one of the solutions to this situation is to use viewmodel. Check out the code below. I am trying to rewrite this piece with VM.

@Composable
fun DaysOfWeek(
    days: Int = 6,
    //viewModel: MyViewModel = MyViewModel()
){

    val states = remember{
        SnapshotStateList<Boolean>().also {
            for(day in 0..days){
                it.add(false)
            }
        }
    }
    
    val person = mutableListOf(0, 0, 0, 0, 0, 0, 0)
    val person1 = remember{ mutableStateOf(person) }
    /*val st = remember {
        viewModel.snap
    }*/

    Column() {
        Row(horizontalArrangement = Arrangement.SpaceEvenly){
            for(day in 0..days){
                DaysOfWeekContainer(
                    color = if (states[day]) Color.Green else Color.Transparent
                ){
                    DaysOfWeekButton(
                        onClick =
                        {
                            //viewModel.snapChanged(day)
                            states[day] = !states[day]
                            if(states[day]) person1.value.set(day, 1)
                            else person1.value.set(day, 0)
                        },
                        day = day
                    )
                }
            }
        }
        Spacer(modifier = Modifier.height(20.dp))
        Text("${person1.value}")
    }
}

VM:

class MyViewModel {
    //state
    var clicked by mutableStateOf(false)
    var color1 by mutableStateOf(Color.Transparent)
    var color2 by mutableStateOf(Color.Green)

    var rememem by mutableStateOf(
        SnapshotStateList<Boolean>().also {
            for(day in 0..6){
                it.add(false)
            }
        }
    )

    //events
    fun clickedChange(){clicked = !clicked}

    fun snapChanged(int: Int){
        rememem[int] = !rememem[int]
    }

}

i try this and this is work! but does not save the state when I switch between screens

@Composable
fun DaysOfWeek(
    days: Int = 6,
    viewModel: MyViewModel = MyViewModel()
){
    
    val person = mutableListOf(0, 0, 0, 0, 0, 0, 0)
    val person1 = remember{ mutableStateOf(person) }

    Column() {
        Row(horizontalArrangement = Arrangement.SpaceEvenly){
            for(day in 0..days){
                DaysOfWeekContainer(
                    color = if(viewModel.rememem[day]) viewModel.color2 else viewModel.color1
                ){
                    DaysOfWeekButton(
                        onClick =
                        {
                            viewModel.snapChanged(day)
                            if(viewModel.rememem[day]) person1.value.set(day, 1)
                            else person1.value.set(day, 0)
                        },
                        day = day
                    )
                }
            }
        }
        Spacer(modifier = Modifier.height(20.dp))
        Text("${person1.value}")
    }
}

on screen i have 7 buttons and every time i click on one of them they change color.
how can i solve the problem use VM. States on screen changes, but not saved when switching the screen.

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文