如何从 kotlin 协程中的函数返回 fusedLocationProviderClient().lastLocation 作为流

Saq*_*que 3 android fusedlocationproviderapi kotlin-coroutines kotlinx.coroutines.flow

我在做什么

因此,我正在开发一个天气预报应用程序,其中我使用 fusedLocationProviderClient.lastLocation 访问设备位置,并且我们大多数人都知道位置提供程序返回一个任务,因此我使用协程 Deferred ,以便每当任务完成时它都会给出我的设备位置请查看代码以便更好地理解

private fun getLastDeviceLocation(): Deferred<Location?> {
        return if (hasLocationPermission())
            fusedLocationProviderClient.lastLocation.asDeferred()
        else
            throw LocationPermissionNotGrantedException()
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是什么

但现在我希望我的位置是一个实时位置,因此我必须使用协程流,这样每当我的位置发生变化时,我就能够自动获取新位置的天气,但因为我是 kotlin 协程的新手,所以我我不知道如何实现这一点以及我如何能够使用延迟流,

任何人都可以帮助我,或者如果这不可行,请建议我做一些其他工作来实现我的目标 提前致谢

Eug*_*nec 7

如果你想转换DeferredFlow

val lastLocationFlow: Flow<Location> = flow {
    emit(fusedLocationProviderClient.lastLocation.asDeferred().await())
}
Run Code Online (Sandbox Code Playgroud)

flow是最基本的流程构建器。它接受一个可挂起的块作为参数,负责发出值。Deferred.await()将暂停执行,直到任务返回 a Location(或null)。然后流程将发出该值并完成。


requestLocationUpdates如果你想从回调转换为Flow,你可以使用callbackFlow.