在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
相关产品推荐
相关产品推荐

