You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Kotlin Jetpack Compose中实现单例并跨双屏UI与ViewModel共享列表

问题:跨Composable页面共享同一列表实例

我定义了如下数据类:

data class SelectedNtrItem(
        val items:ArrayList<NutritionSearchItem> = arrayListOf()
    )

需要在两个Composable页面中使用同一个实例的该列表,计划通过单例实现并在UI和ViewModel中访问,但未完全实现。我创建了如下单例类:

class SelectedNtrItemManager {
    companion object{
        private val _selectedNtrItem = MutableStateFlow(SelectedNtrItem())
        val selectedNtrItem: StateFlow<SelectedNtrItem> = _selectedNtrItem.asStateFlow()
    }
}

请问如何在两个页面的ViewModel和UI中访问这个单例列表,以保证双屏使用同一数据实例?

解决方案

我通过以下方式解决了问题:

单例状态管理器

object SelectedNtrItemManager {

    var selectedItems =  SnapshotStateList<NutritionSearchItem>()

    fun addItem(item: NutritionSearchItem) {
        selectedItems.add(item)
    }

    fun removeItem(item: NutritionSearchItem) {
        selectedItems.remove(item)
    }
}

FirstScreen ViewModel

val selectedItems: SnapshotStateList<NutritionSearchItem>
        get() = SelectedNtrItemManager.selectedItems

  fun addSelectedNutritionItem(
       ntrItem: NutritionSearchItem
   ) {
       if (selectedItems.contains(ntrItem)) {
           SelectedNtrItemManager.removeItem(ntrItem)
       } else {
           SelectedNtrItemManager.addItem(ntrItem)
       }
   }

SecondScreen ViewModel

class SecondScreenVM : ViewModel() {

    val list: SnapshotStateList<NutritionSearchItem>
        get() = SelectedNtrItemManager.selectedItems

    fun deleteItemFromList(item: NutritionSearchItem) {
        SelectedNtrItemManager.removeItem(item)
    }
}

SecondScreen UI

val list = viewModel.list
LazyColumn(modifier = Modifier.padding(15.dp)) {
                items(list) { item ->....
}

使用SnapshotStateList可以自动检测数据变化并通知监听者,更新后的SelectedNtrItemManager可完美实现跨页面共享同一数据实例的需求。

内容的提问来源于stack exchange,提问作者NewPartizal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:50:07