我有一个 http 响应,其主体是 ByteReadChannel。我知道内容是 JSON 对象数组。我需要通过 JSON 对象的属性来过滤该响应主体。由于数组...
我有一个 http 响应,其主体是 ByteReadChannel
。我知道内容是一个 JSON
对象数组。我需要根据对象的属性过滤该响应主体 JSON
。由于该数组可能包含至少数千个对象,因此我希望避免将整个内容读入内存,应用我的过滤器并将结果发送到客户端。
我怎样才能将其转换 ByteReadChannel
为,比如说, Flow<MyJsonObject>
流上的过滤器? Flow
这只是一个例子,也许有更好的类可以使用......
附言:我用 Ktor
.
问题是您的 Compose UI 无法检测到 count
视图模型中的变化。
您需要存储 count
在 State 对象中。在可组合对象中,您可以使用类似这样的方法( by
解开 State,使其成为 Int,可以更轻松地使用):
var count: Int by remember { mutableStateOf(1) }
每当更新此变量时,都会触发重组,并且 UI 也会相应更新。由于您使用视图模型进行存储,因此 count
您需要使用 Flow:
class MainViewModel : ViewModel() {
private val _count = MutableStateFlow(1)
val count = _count.asStateFlow()
fun rollDice() {
Log.d("ViewModel", "ButtonClicked")
_count.value = (1..6).random()
}
}
每当 rollDice
调用 count
,流程都会发生变化。您可以使用以下命令将可组合项中的此流程转换为 Compose State 对象 collectAsStateWithLifecycle
(您需要 gradle 依赖项 androidx.lifecycle:lifecycle-runtime-compose
):
setContent {
val mainViewModel: MainViewModel = viewModel()
val count: Int by mainViewModel.count.collectAsStateWithLifecycle()
Column(
modifier = Modifier
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
) {
DiceImage(count = count)
Button(onClick = {
mainViewModel.rollDice()
}) {
Text(text = "Let's Roll")
}
}
}