【问题标题】:How to save the state of a toggle button after restarting app in jetpack compose?在jetpack compose中重新启动应用程序后如何保存切换按钮的状态?
【发布时间】:2022-10-25 23:55:31
【问题描述】:

重新启动应用程序后,我正在尝试保存按钮的状态。一切正常,点击后心形按钮变为红色,但是当我重新启动应用程序时,它会恢复到默认状态。我想将它存储在我的 Firebase Firestore 中。

我最喜欢的按钮:

fun FavoriteButton(shoe : ShoeModel){

    val myviewModel : FirebaseFirestoreVM =
        viewModel(LocalContext.current as ViewModelStoreOwner, key = shoe.shoeName)

    val isFavorite = myviewModel.isFavorite

    IconToggleButton(
        checked = isFavorite.value ,
        onCheckedChange = {
            isFavorite.value = !isFavorite.value
        }
    ) {
        Icon(
            imageVector = if (isFavorite.value) {
                Icons.Filled.Favorite
            } else {
                Icons.Filled.FavoriteBorder
            }, contentDescription = null, tint = MaterialTheme.colors.primary
        )
    }

    if (isFavorite.value) {
        myviewModel.addToDatabase(shoe)
    }

}

我的视图模型

  val isFavorite : MutableState<Boolean> = mutableStateOf(false)

    fun addToDatabase(shoe : ShoeModel){
        val obj = ShoeModel(
            shoe.shoeName,
            shoe.shoeImage,
            shoe.shoeDescription,
            shoe.shoePrice,
            shoe.shoeFrontSide,
            shoe.shoeBackSide,
            shoe.shoeSide,
            shoe.isFavorite
        )
        db.collection("shoes").document(shoe.shoeName).set(obj)
    }

【问题讨论】:

  • 您在viewmodel 中将isFavorite 的默认值分配为false。所以每次应用程序启动时都会选择它。您可以通过迭代db 集合来初始化isFavorite 的值,无论对应的shoe 是否存在。不要为每个FavoriteButton 迭代db 寻找一种有效的方法,或者将您最初检索到的数据集复制到viewmodels 局部变量中[如果可能的话]。
  • 你能给我一个例子来说明我如何实现它吗?
  • 例如...?

标签: android kotlin google-cloud-firestore android-jetpack-compose jetpack


【解决方案1】:

一切正常,点击后心形按钮变为红色,但是当我重新启动应用程序时,它会恢复到默认状态。

这正如预期的那样工作得很好,因为任何时候更新状态都会发生重组。这是预期的行为,因为 Jetpack Compose 是声明性的,更新 UI 的唯一方法是使用新参数调用相同的可组合对象。

如果您将默认值设置为状态,然后根据切换按钮的新值进行更改,它会起作用,但是一旦您重新启动应用程序,它将重置为默认值。因此,在这种情况下,您应该找到一个在应用程序重新启动后仍然存在的数据结构。所以你要么使用像DataStoreSharedPreferences 这样的本地结构。但是,它们都没有在应用程序卸载后幸存下来。

我想将它存储在我的 Firebase Firestore 中。

这是一个更好的主意。将数据存储在云中,始终是一种解决方案。为什么?因为无论应用程序发生什么,数据都将始终存在。几周前我已经回答了一个相关问题,我在其中解释了如何保留两个单选按钮的状态。该解决方案也适用于切换按钮:

【讨论】:

    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多