首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firestore Snapshot with Coroutines?

Firestore Snapshot with Coroutines?
EN

Stack Overflow用户
提问于 2021-05-31 11:03:12
回答 1查看 50关注 0票数 0

您好,我试图使协程流动(使用callbackFlow),并试图将其转换为实时数据,但它似乎没有更新。

你可以在下面看到我的代码:

代码语言:javascript
复制
@ExperimentalCoroutinesApi
suspend fun checkInDanger(): Flow<NetworkStatus<List<UserFire>>> = callbackFlow {
    val check = fs.collection(UserFire.COLLECTION).whereEqualTo(UserFire.DANGER, true)
        .addSnapshotListener { value, e ->
            if (e != null) {
                trySend(NetworkStatus.Failed("Error occurred\n${e.code}"))
                return@addSnapshotListener
            }
            if (value == null || value.isEmpty) trySend(NetworkStatus.Empty)
            else {
                val users = value.map { it.toObject(UserFire::class.java) }
                trySend(NetworkStatus.Success(users))
            }
        }
    awaitClose {  }
}.flowOn(Dispatchers.IO)

在我的存储库上:

代码语言:javascript
复制
@ExperimentalCoroutinesApi
override suspend fun checkInDanger(): Flow<Status<List<User>>> = flow {
    when (val result = network.checkInDanger().first()) {
        is NetworkStatus.Success -> emit(Status.Success(result.data.map {
            MapVal.userFireToDom(it)
        }))
        is NetworkStatus.Empty -> emit(Status.Success(listOf<User>()))
        is NetworkStatus.Failed -> emit(Status.Error(null, result.error))
    }
}

在我的ViewModel中:

代码语言:javascript
复制
val checkInDanger = liveData(Dispatchers.IO) {
    try {
        useCase.checkInDanger().collectLatest {
            emit(it)
        }
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

但当我更改Firebase中的值时,它并没有获取新数据...有人知道为什么它没有修复吗?

EN

回答 1

Stack Overflow用户

发布于 2021-05-31 11:03:12

我找到了方法,但它是使用回调的,如果我们使用回调,它可以在没有实时数据的情况下获取数据更新,但对于我的例子,我再次尝试将回调推送到实时数据,因此代码将如下所示:

代码语言:javascript
复制
fun checkInDanger(networkStatus: (NetworkStatus<List<UserFire>>) -> Unit) {
    fs.collection(UserFire.COLLECTION).whereEqualTo(UserFire.DANGER, true)
        .addSnapshotListener { value, e ->
            if (e != null) {
                networkStatus(NetworkStatus.Failed("Error occurred\n${e.code}"))
                return@addSnapshotListener
            }
            if (value == null || value.isEmpty) networkStatus(NetworkStatus.Empty)
            else {
                val users = value.map { it.toObject(UserFire::class.java) }
                networkStatus(NetworkStatus.Success(users))
            }
        }
}

在我的存储库中:

代码语言:javascript
复制
override fun checkInDanger(callback: (Status<List<User>>) -> Unit) {
    network.checkInDanger { result ->
        when (result) {
            is NetworkStatus.Success -> callback(Status.Success(result.data.map {
                MapVal.userFireToDom(it)
            }))
            is NetworkStatus.Empty -> callback(Status.Success(listOf<User>()))
            is NetworkStatus.Failed -> callback(Status.Error(null, result.error))
        }
    }
}

在我的ViewModel中:

代码语言:javascript
复制
fun checkInDanger(callback: (Status<List<User>>) -> Unit) = useCase.checkInDanger { callback(it) }

val setUsers = MutableLiveData<List<User>>().apply { this.value = listOf() }
val users: LiveData<List<User>> = setUsers

在我的UI类(Fragment Main)中:

代码语言:javascript
复制
val inDangerCallback: (Status<List<User>>) -> Unit =  {
    if (relative != null) {
        when (it) {
            is Status.Success ->
                viewModel.setUsers.value =
                    it.data?.filter { user -> user.username in relative!!.pure }
            else -> requireView().createSnackBar(it.error!!, 1000)
        }
    }
}
viewModel.checkInDanger(inDangerCallback)

viewModel.users.observe(viewLifecycleOwner) { users ->
    println(users.size})
    users?.forEach { user -> println(user.username) }
}

代码可以完美运行并自动更新...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67767465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档