ViewModel

✅ViewModel

主要功能:

  • 从 Repository 获取数据
  • 将数据转换为 UI 状态
  • 管理数据流和生命周期

1. 数据管理

HomeScreenViewModel.kt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class HomeViewModel(itemsRepository: ItemsRepository): ViewModel(){
companion object {
private const val TIMEOUT_MILLIS = 5_000L
}
val homeUiState: StateFlow<HomeUiState> = itemsRepository.getAllItemsStream().map { HomeUiState(it) }
.stateIn(scope = viewModelScope,
started = SharingStarted.WhileSubscribed(TIMEOUT_MILLIS),
initialValue = HomeUiState()
)
}

/**
* itemsRepository.getAllItemsStream() - 获取商品数据流
*.map { HomeUiState(it) } - 将数据转换为 UI 状态
*.stateIn(...) - 转换为 StateFlow 供 UI 使用
*/
data class HomeUiState(val itemList: List<Item> = listOf())

2. 业务逻辑处理

ItemEntryViewModel.kt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class ItemEntryViewModel(private val itemsRepository: ItemsRepository) : ViewModel() {
var itemUiState by mutableStateOf(ItemUiState())
private set
fun updateUiState(itemDetails: ItemDetails) {
itemUiState =
ItemUiState(itemDetails = itemDetails, isEntryValid = validateInput(itemDetails))
}
// 处理用户输入验证
private fun validateInput(uiState: ItemDetails): Boolean {
return with(uiState) {
name.isNotBlank() && price.isNotBlank() && quantity.isNotBlank()
}
}

// 处理数据保存
suspend fun saveItem() {
if (validateInput()) {
itemsRepository.insertItem(itemUiState.itemDetails.toItem())
}
}
}

data class ItemDetails(
val id: Int = 0,
val name: String = "",
val price: String = "",
val quantity: String = "",
)

✅ViewModelProvider

主要功能:
创建 ViewModel 实例
注入必要的依赖(如 Repository)
管理 ViewModel 的生命周期

AppViewModelProvider.kt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
object AppViewModelProvider {
val Factory = viewModelFactory {
// Initializer for ItemEntryViewModel
initializer {
ItemEntryViewModel(inventoryApplication().container.itemsRepository)
}

// Initializer for HomeViewModel
initializer {
HomeViewModel(inventoryApplication().container.itemsRepository)
}
}
}

fun CreationExtras.inventoryApplication(): InventoryApplication =
(this[AndroidViewModelFactory.APPLICATION_KEY] as InventoryApplication)
  • Copyrights © 2023-2025 Hexo

请我喝杯咖啡吧~

支付宝
微信