所以,我有mutableStateListOf
一个viewModel
:
var childTravellersList = mutableStateListOf<TravellersDetails>()
Run Code Online (Sandbox Code Playgroud)
TravellersDetails
是一个数据类,有一个名为 的字段error
。
这childTravellersList
在 UI 中使用为:
val list = remember{viewModel.childTravellersList}
LazyColumn(state = lazyColumnState) {
itemsIndexed(list) { index, item ->
SomeBox(show = if(item.error) true else false)
}
}
Run Code Online (Sandbox Code Playgroud)
我在给定的TravellersDetailsviewModel
更新中编写了一个函数:error
index
childTravellersList
fun update(index){
childTravellersList[index].error = true
}
Run Code Online (Sandbox Code Playgroud)
因此,每当我调用此函数时,列表都应该更新。
这会更新列表,但不会触发 UI 重组。我哪里做错了?
因此,我创建了一个 Chip 可组合项并在 LazyRow 中使用它,如下所示:
LazyRow(
modifier = modifier,
horizontalArrangement = Arrangement.spacedBy(16.dp),
){
items.forEach { it ->
item {
CustomChip(
item = it,
isSelected = it == currentItem,
onItemChanged = {
onItemChanged(it)
}
)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想获得像上面提到的图像这样的布局。即,如果筹码数量到达屏幕末尾,则新筹码应排在新行中。
我在 Room 中使用自定义对象列表时遇到错误。
error: Cannot figure out how to save this field into database. You can consider adding a type converter for it.
Run Code Online (Sandbox Code Playgroud)
所以我的数据类是这样的:
@Entity(tableName = "calorie_daily_table")
data class CalorieDaily(
@PrimaryKey
var date: String,
var breakfast: List<Meal>)
data class Meal(
var foodItem: String,
var foodQuantity: String,
var calorie: Int)
Run Code Online (Sandbox Code Playgroud)
我如何编写一个 TypeConverter 来处理这个问题?
所以,我有这样的事情:
class Converter {
var gson = Gson()
@TypeConverter
fun foodItemToString(foodItems: List<FoodItem>): String {
return gson.toJson(foodItems)
}
@TypeConverter
fun stringToFoodItem(data: String): List<FoodItem> {
val listType = object : …
Run Code Online (Sandbox Code Playgroud) 我正在 ViewModel 中进行 API 调用,并在可组合项中观察它,如下所示:
class FancyViewModel(): ViewModel(){
private val _someUIState =
MutableStateFlow<FancyWrapper>(FancyWrapper.Nothing)
val someUIState: StateFlow<FancyWrapper> =
_someUIState
fun attemptAPICall() = viewModelScope.launch {
_someUIState.value = FancyWrapper.Loading
when(val res = doAPICall()){
is APIWrapper.Success -> _someUIState.value = FancyWrapper.Loading(res.vaue.data)
is APIWrapper.Error -> _someUIState.value = FancyWrapper.Error("Error!")
}
}
}
Run Code Online (Sandbox Code Playgroud)
在可组合项中,我正在听“someUIState”,如下所示:
@Composable
fun FancyUI(viewModel: FancyViewModel){
val showProgress by remember {
mutableStateOf(false)
}
val openDialog = remember { mutableStateOf(false) }
val someUIState =
viewModel.someUIState.collectAsState()
when(val res = someUIState.value){
is FancyWrapper.Loading-> showProgress = true
is FancyWrapper.Success-> { …
Run Code Online (Sandbox Code Playgroud) android kotlin android-jetpack android-jetpack-compose kotlin-stateflow