You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
5.5 KiB
Dart
182 lines
5.5 KiB
Dart
import 'dart:async';
|
|
|
|
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:car_provider_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';
|
|
|
|
class PickLocationPage extends StatefulWidget {
|
|
Function(double, double, String) onPickAddress;
|
|
|
|
PickLocationPage({required this.onPickAddress});
|
|
|
|
@override
|
|
State<PickLocationPage> createState() => _PickLocationPageState();
|
|
}
|
|
|
|
class _PickLocationPageState extends State<PickLocationPage> {
|
|
double latitude = 0;
|
|
double longitude = 0;
|
|
|
|
final Set<Marker> markers = new Set();
|
|
late AppMap appMap;
|
|
|
|
static CameraPosition _kGooglePlex = CameraPosition(
|
|
target: LatLng(37.42796133580664, -122.085749655962),
|
|
zoom: 14.4746,
|
|
);
|
|
late LatLng currentPostion;
|
|
Completer<GoogleMapController> mapController = Completer();
|
|
final ValueNotifier<String> _counter = ValueNotifier<String>("");
|
|
|
|
@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<String>(
|
|
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: 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,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
width: double.infinity,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(12.0),
|
|
child: ShowFillButton(
|
|
title: LocaleKeys.pickAddress.tr(),
|
|
onPressed: () {
|
|
widget.onPickAddress(latitude, longitude, _counter.value);
|
|
pop(context);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Future<void> _updatePosition(CameraPosition _position) async {
|
|
latitude = _position.target.latitude;
|
|
longitude = _position.target.longitude;
|
|
updateAddress(latitude, longitude);
|
|
}
|
|
|
|
void _getUserLocation() async {
|
|
if (await Permission.location.request().isGranted) {
|
|
var position = await GeolocatorPlatform.instance.getCurrentPosition();
|
|
currentPostion = 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();
|
|
currentPostion = LatLng(position.latitude, position.longitude);
|
|
latitude = position.latitude;
|
|
longitude = position.longitude;
|
|
setMap();
|
|
updateAddress(latitude, longitude);
|
|
}
|
|
},
|
|
);
|
|
}
|
|
}
|
|
|
|
updateAddress(double latitude, double longitude) async {
|
|
// List<Placemark> placemarks =
|
|
// await placemarkFromCoordinates(latitude, longitude);
|
|
// _counter.value =
|
|
// '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
|
|
// print("Address121: " + placemarks[0].toString());
|
|
}
|
|
|
|
setMap() {
|
|
setState(() {
|
|
_kGooglePlex = CameraPosition(
|
|
target: currentPostion,
|
|
zoom: 14.4746,
|
|
);
|
|
appMap.moveTo(cameraPostion: _kGooglePlex);
|
|
});
|
|
}
|
|
|
|
Future<String> getCurrentAddress() async {
|
|
// List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude);
|
|
// return placemarks.first.name ?? "";
|
|
return "";
|
|
}
|
|
}
|
|
|
|
Future<Map<Permission, PermissionStatus>> requestPermissions() async {
|
|
var permissionResults = [Permission.calendar].request();
|
|
return permissionResults;
|
|
}
|