Как вернуть 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
.