微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jetpackCompose 和 Flow 中的状态问题

如何解决jetpackCompose 和 Flow 中的状态问题

我现在在 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
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。