import 'dart:async'; import 'dart:developer'; import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:permission_handler/permission_handler.dart'; import 'map_selection_widget.dart'; import 'package:geocoding/geocoding.dart'; class PickLocationPage extends StatefulWidget { final Function(double, double, String) onPickAddress; const PickLocationPage({super.key, required this.onPickAddress}); @override State createState() => _PickLocationPageState(); } class _PickLocationPageState extends State { double latitude = 0; double longitude = 0; final Set markers = {}; late AppMap appMap; static CameraPosition _kGooglePlex = const CameraPosition( target: LatLng(37.42796133580664, -122.085749655962), zoom: 14.4746, ); late LatLng currentPosition; Completer mapController = Completer(); final ValueNotifier _counter = ValueNotifier(""); @override void initState() { appMap = AppMap( _kGooglePlex.toMap() as Map, onCameraMove: (camera) { _updatePosition(camera); }, onMapCreated: () { // goToCurrentLocation(); _getUserLocation(); setState(() {}); }, ); super.initState(); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: CustomAppBar( title: LocaleKeys.pickLocation.tr(), isRemoveBackButton: false, ), body: Column( children: [ Expanded( child: Stack( children: [ if (appMap != null) appMap, ValueListenableBuilder( builder: (BuildContext context, String value, Widget? child) { // This builder will only get called when the _counter // is updated. return value.isNotEmpty ? Container( width: double.infinity, margin: const EdgeInsets.all(12), child: Card( child: Padding( padding: const EdgeInsets.all(12.0), child: Text(value ?? ""), )), ) : Container(); }, valueListenable: _counter, ), const Align( alignment: Alignment.center, child: Icon( Icons.place, color: Colors.red, size: 50, ), ), ], ), ), SizedBox( width: double.infinity, child: Padding( padding: const EdgeInsets.all(12.0), child: ShowFillButton( maxHeight: 55, title: LocaleKeys.pickAddress.tr(), onPressed: () { widget.onPickAddress(latitude, longitude, _counter.value); pop(context); }, ), ), ), ], ), ); } Future _updatePosition(CameraPosition position) async { latitude = position.target.latitude; longitude = position.target.longitude; log(latitude.toString()); log(latitude.toString()); updateAddress(latitude, longitude); } void _getUserLocation() async { if (await Permission.location.request().isGranted) { var position = await GeolocatorPlatform.instance.getCurrentPosition(); currentPosition = LatLng(position.latitude, position.longitude); latitude = position.latitude; longitude = position.longitude; setMap(); updateAddress(latitude, longitude); } else { requestPermissions().then( (value) async { if (value[Permission.location]!.isGranted) { var position = await GeolocatorPlatform.instance.getCurrentPosition(); currentPosition = LatLng(position.latitude, position.longitude); latitude = position.latitude; longitude = position.longitude; setMap(); updateAddress(latitude, longitude); } }, ); } } updateAddress(double latitude, double longitude) async { List placemarks = await placemarkFromCoordinates(latitude, longitude); _counter.value = '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}'; } setMap() { setState(() { _kGooglePlex = CameraPosition( target: currentPosition, zoom: 14.4746, ); appMap.moveTo(cameraPostion: _kGooglePlex); }); } Future getCurrentAddress() async { // List placemarks = await placemarkFromCoordinates(latitude, longitude); // return placemarks.first.name ?? ""; return ""; } } Future> requestPermissions() async { var permissionResults = [Permission.location].request(); return permissionResults; }