#android #location #datastore
Вопрос:
Когда я перемещаю карту, новая координата собирается из потока изменяемых данных. Я хочу сохранить новую координату, переместив карту в хранилище данных, но она работает неправильно, и карта повреждена. Как я могу это исправить?
В кодах ViewModel у меня есть эти три функции для ЗНАЧЕНИЙ ИНИЦИАЛОВ и ЗНАЧЕНИЙ МЕСТОПОЛОЖЕНИЯ ОБНОВЛЕНИЯ и УСТАНОВКИ МЕСТОПОЛОЖЕНИЯ
private val _location = MutableStateFlow(getInitialLocation()) val location: StateFlowlt;Locationgt; = _location private fun getInitialLocation(): Location = let { Location("").let { it.latitude = 14.599168243865952 it.longitude = 120.98413870283683 it } } fun updateLocation(latitude: Double, longitude: Double) { setLocation(Location("").let { it.latitude = latitude it.longitude = longitude it }) } private fun setLocation(loc: Location) { _location.value = loc }
Коды на экране карты:
@Composable private fun MapViewContainer( mapView: MapView, navigatorViewModel: PickLocationViewModel ) { val context = LocalContext.current val dataStore = CheckLocationIsSetDataStore(context = context) AndroidView( factory = { mapView } ) { mapView.getMapAsync { map -gt; map.apply { navigatorViewModel.apply { val location = location.value val position = LatLng(location.latitude, location.longitude) moveCamera(CameraUpdateFactory.newLatLngZoom(position, Constants.ZOOM_CAMERA)) setOnCameraIdleListener { val cameraPosition = map.cameraPosition updateLocation( cameraPosition.target.latitude, cameraPosition.target.longitude ) } viewModelScope.launch { this@apply.location.collect{ location -gt; dataStore.set(CheckLocationIsSetModel(location.altitude, location.longitude)) } } } } } } }
Коды классов хранилищ данных:
class CheckLocationIsSetDataStore @Inject constructor(private val context: Context) : IDataStorelt;CheckLocationIsSetModel, CheckLocationIsSetModelgt; { override val get: Flowlt;CheckLocationIsSetModelgt; get() = context.dataStore.data.catch { exception -gt; if (exception is IOException) { Log.e("DataStore Exception: ", exception.toString()) emit(emptyPreferences()) } else { throw exception } }.map { preferences -gt; CheckLocationIsSetModel( lat = preferences[DataStoreKeys.IS_LOCATION_LAT_SET_KEY] ?: Constants.IF_LOCATION_LAT_NOT_SET, lng = preferences[DataStoreKeys.IS_LOCATION_LNG_SET_KEY] ?: Constants.IF_LOCATION_LNG_NOT_SET ) } override suspend fun set(param: CheckLocationIsSetModel?) { context.dataStore.edit { preferences -gt; preferences[DataStoreKeys.IS_LOCATION_LAT_SET_KEY] = param?.lat ?: 0.0 preferences[DataStoreKeys.IS_LOCATION_LNG_SET_KEY] = param?.lng ?: 0.0 } } }