问题描述
我现在在 JetpackCompose 中遇到了问题。 问题是,当我从流中收集数据时,值是从 firebase 获取的,就像有一个侦听器一样,并且数据每次都在变化。但事实并非如此。
我不知道真正的问题是什么!
FirebaseSrcNav
suspend fun getName(uid: String): Flow<Resource.Success<Any?>> = flow {
val query = userCollection.document(uid)
val snapshot = query.get().await().get("username")
emit(Resource.success(snapshot))
}
NavRepository
suspend fun getName(uid: String) = firebase.getName(uid)
Homeviewmodel
fun getName(uid: String): MutableStateFlow<Any?> {
val name = MutableStateFlow<Any?>(null)
viewmodelScope.launch {
navRepository.getName(uid).collect { nameState ->
when (nameState) {
is Resource.Success -> {
name.value = nameState.data
//_posts.value = state.data
loading.value = false
}
is Resource.Failure<*> -> {
Log.e(nameState.throwable,nameState.throwable)
}
}
}
}
return name
}
我认为问题出在主屏幕上,当我调用 collectasstate().value 时。
主屏幕
val state = rememberLazyListState()
LazyColumn(
state = state,verticalArrangement = Arrangement.spacedBy(10.dp)
) {
items(post) { post ->
//val difference = homeviewmodel.getDateTime(homeviewmodel.getTimestamp())
val date = homeviewmodel.getDateTime(post.timeStamp!!)
val name = homeviewmodel.getName(post.postAuthor_id.toString()).collectAsstate().value
QuestionCard(
name = name.toString(),date = date!!,image = "",text = post.postText!!,like = 0,response = 0,topic = post.topic!!
)
}
}
我无法发布视频,但如果您需要图像,请想象一个 textField,其中测试每 0.005 秒在“null”和“MyName”之间交替。
解决方法
查看官方文档。
https://developer.android.com/kotlin/flow
流是异步的
在视图模型上
private val _name = MutableStateFlow<String>("")
val name: StateFlow<String>
get() = _name
fun getName(uid: String) {
viewModelScope.launch {
//asyn call
navRepository.getName(uid).collect { nameState ->
when (nameState) {
is Resource.Success -> {
name.value = nameState.data
}
is Resource.Failure<*> -> {
//manager error
Log.e(nameState.throwable,nameState.throwable)
}
}
}
}
}
在你看来
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
...
lifecycleScope.launch {
viewModel.name.collect { name -> handlename
}
}
}