Initial commit
This commit is contained in:
96
lib/widget/place_picker/location_controller.dart
Normal file
96
lib/widget/place_picker/location_controller.dart
Normal file
@@ -0,0 +1,96 @@
|
||||
import 'package:driver/widget/place_picker/selected_location_model.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:geocoding/geocoding.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class LocationController extends GetxController {
|
||||
GoogleMapController? mapController;
|
||||
var selectedLocation = Rxn<LatLng>();
|
||||
var selectedPlaceAddress = Rxn<Placemark>();
|
||||
var address = "Move the map to select a location".obs;
|
||||
TextEditingController searchController = TextEditingController();
|
||||
|
||||
RxString zipCode = ''.obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
getArgument();
|
||||
getCurrentLocation();
|
||||
}
|
||||
|
||||
void getArgument() {
|
||||
dynamic argumentData = Get.arguments;
|
||||
if (argumentData != null) {
|
||||
zipCode.value = argumentData['zipCode'] ?? '';
|
||||
if (zipCode.value.isNotEmpty) {
|
||||
getCoordinatesFromZipCode(zipCode.value);
|
||||
}
|
||||
}
|
||||
update();
|
||||
}
|
||||
|
||||
Future<void> getCurrentLocation() async {
|
||||
try {
|
||||
Position position = await Geolocator.getCurrentPosition(
|
||||
desiredAccuracy: LocationAccuracy.high,
|
||||
);
|
||||
selectedLocation.value = LatLng(position.latitude, position.longitude);
|
||||
|
||||
if (mapController != null) {
|
||||
mapController!.animateCamera(
|
||||
CameraUpdate.newLatLngZoom(selectedLocation.value!, 15),
|
||||
);
|
||||
}
|
||||
|
||||
await getAddressFromLatLng(selectedLocation.value!);
|
||||
} catch (e) {
|
||||
print("Error fetching current location: $e");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> getAddressFromLatLng(LatLng latLng) async {
|
||||
try {
|
||||
List<Placemark> placemarks =
|
||||
await placemarkFromCoordinates(latLng.latitude, latLng.longitude);
|
||||
if (placemarks.isNotEmpty) {
|
||||
Placemark place = placemarks.first;
|
||||
selectedPlaceAddress.value = place;
|
||||
address.value = "${place.street}, ${place.locality}, ${place.administrativeArea}, ${place.country}";
|
||||
} else {
|
||||
address.value = "Address not found";
|
||||
}
|
||||
} catch (e) {
|
||||
print("Error getting address: $e");
|
||||
address.value = "Error getting address";
|
||||
}
|
||||
}
|
||||
|
||||
void onMapMoved(CameraPosition position) {
|
||||
selectedLocation.value = position.target;
|
||||
}
|
||||
|
||||
Future<void> getCoordinatesFromZipCode(String zipCode) async {
|
||||
try {
|
||||
List<Location> locations = await locationFromAddress(zipCode);
|
||||
if (locations.isNotEmpty) {
|
||||
selectedLocation.value =
|
||||
LatLng(locations.first.latitude, locations.first.longitude);
|
||||
}
|
||||
} catch (e) {
|
||||
print("Error getting coordinates for ZIP code: $e");
|
||||
}
|
||||
}
|
||||
|
||||
void confirmLocation() {
|
||||
if (selectedLocation.value != null) {
|
||||
SelectedLocationModel selectedLocationModel = SelectedLocationModel(
|
||||
address: selectedPlaceAddress.value,
|
||||
latLng: selectedLocation.value,
|
||||
);
|
||||
Get.back(result: selectedLocationModel);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user