Как вернуть fusedLocationProviderClient(). LastLocation как поток из функции в сопрограммах kotlin

Что я делаю

Поэтому я разрабатываю приложение для прогноза погоды, в котором я получаю доступ к местоположению устройства с помощью fusedLocationProviderClient.lastLocation, и большинство из нас знает, что поставщик местоположения возвращает задачу, поэтому для этого я использую отложенные сопрограммы, чтобы каждый раз, когда задача была завершена, она давала мне местоположение устройства, пожалуйста, посмотрите на код для лучшего понимания

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

В чем моя проблема

но теперь я хочу, чтобы мое местоположение было текущим местоположением, поэтому для этого мне нужно использовать поток сопрограмм, чтобы всякий раз, когда мое местоположение изменяется, я мог автоматически получать погоду для нового местоположения, но поскольку я новичок в корутинах kotlin, я я не уверен, как этого добиться и как я могу использовать поток с отложенным,

может ли кто-нибудь помочь мне, или, если это невозможно, предложите мне другую работу для достижения моей цели Заранее спасибо

1 ответ

Если вы хотите конвертировать Deferred к Flow:

val lastLocationFlow: Flow<Location> = flow {
    emit(fusedLocationProviderClient.lastLocation.asDeferred().await())
}

flow это самый простой конструктор потока. В качестве параметра он принимает приостанавливаемый блок, который отвечает за выдачу значений. Deferred.await() приостановит выполнение, пока задача не вернет Location (или null). Затем поток выдаст значение и завершится.


Если вы хотите конвертировать requestLocationUpdates от обратного вызова до Flow, вы могли бы использовать callbackFlow.