我有 Json 資料,我通過它來做這件事。
fun getFact(context: Context) = viewModelScope.launch{
try {
val format = Json {
ignoreUnknownKeys = true
prettyPrint = true
isLenient = true
}
val factJson = context.assets.open("Facts.json").bufferedReader().use {
it.readText()
}
val factList = format.decodeFromString<List<FootballFact>>(factJson)
_uiState.value = ViewState.Success(factList)
} catch (e: Exception) {
_uiState.value = ViewState.Error(exception = e)
}
}
這是我從 Ui sceeen 的 viewModle 獲得作業的方式
viewModel.getFact(context)
when (val result =
viewModel.uiState.collectAsState().value) {
is ViewState.Error -> {
Toast.makeText(
context,
"Error ${result.exception}",
Toast.LENGTH_SHORT
).show()
}
is ViewState.Success -> {
val factsLists = mutableStateOf(result.fact)
val randomFact = factsLists.value[0]
FactCard(quote = randomFact.toString()) {
factsLists.value.shuffled()
}
}
}
我有事實卡,我想在其中顯示該事實。此外,我還有一個用于單擊的 lambda,我希望每次單擊時我的 factList 都會重繪 。
@Composable
fun FactCard(quote: String , onClick : ()-> Unit) {
val fact = remember { mutableStateOf(quote)}
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.
.clickable { onClick() }
) {
Text(.. )
}
}
我不知道如何處理這個,我認為我在做一些愚蠢的事情。
uj5u.com熱心網友回復:
Composables 只能在您更新狀態資料時重構。你不這樣做。您的點擊事件應該回傳您想要顯示的新報價。然后您設定fact.value為新報價。fact.value使用新值呼叫是觸發重構的原因:
when (val result = viewModel.uiState.collectAsState().value) {
is ViewState.Error -> {
Toast.makeText(
context,
"Error ${result.exception}",
Toast.LENGTH_SHORT
).show()
}
is ViewState.Success -> {
val factsLists = mutableStateOf(result.fact)
val randomFact = factsLists.value[0]
FactCard(quote = randomFact.toString()) {
return factsLists.value.shuffled()[0]
}
}
}
@Composable
fun FactCard(quote: String , onClick : ()-> String) {
var fact = remember { mutableStateOf(quote)}
Box(
contentAlignment = Alignment.Center,
modifier = Modifier.
.clickable {
fact.value = onClick()
}
) {
Text(.. )
}
}
uj5u.com熱心網友回復:
factsLists.shuffled() 回傳一個新串列,該串列的元素隨機排列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/345414.html
標籤:安卓 科特林 android-jetpack-compose 流动
上一篇:如何在房間里做多張桌子
下一篇:POSThttp://localhost:3001/createPost404(NotFound)EXPRESS&REACT
