Reformatting
parent
623d21fc80
commit
55363e4e9f
@ -0,0 +1,69 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||||
|
|
||||||
|
class AppMap extends StatefulWidget {
|
||||||
|
final CameraPositionCallback onCameraMove;
|
||||||
|
Map initialCamera;
|
||||||
|
|
||||||
|
late AppMapState _state;
|
||||||
|
final Function onMapCreated;
|
||||||
|
|
||||||
|
AppMap(this.initialCamera,
|
||||||
|
{required this.onCameraMove, required this.onMapCreated});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _state = AppMapState();
|
||||||
|
|
||||||
|
moveTo({required CameraPosition cameraPostion}) {
|
||||||
|
_state.googleMapController
|
||||||
|
.animateCamera(CameraUpdate.newCameraPosition(cameraPostion));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class AppMapState extends State<AppMap> {
|
||||||
|
bool isHuawei = false;
|
||||||
|
|
||||||
|
Completer<GoogleMapController> _googleMapControllerComp = Completer();
|
||||||
|
late GoogleMapController googleMapController;
|
||||||
|
|
||||||
|
checkIsHuawei() async {
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
super.dispose();
|
||||||
|
googleMapController.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (isHuawei == null) return CircularProgressIndicator();
|
||||||
|
return googleMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget googleMap() {
|
||||||
|
return GoogleMap(
|
||||||
|
mapType: MapType.normal,
|
||||||
|
zoomControlsEnabled: true,
|
||||||
|
myLocationButtonEnabled: true,
|
||||||
|
myLocationEnabled: true,
|
||||||
|
initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ??
|
||||||
|
const CameraPosition(
|
||||||
|
target: LatLng(-26.1711459, 27.9002758), zoom: 2.0),
|
||||||
|
onCameraMove: widget.onCameraMove,
|
||||||
|
onMapCreated: (GoogleMapController controller) {
|
||||||
|
googleMapController = controller;
|
||||||
|
_googleMapControllerComp.complete(controller);
|
||||||
|
widget.onMapCreated();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,180 @@
|
|||||||
|
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: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 {
|
||||||
|
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;
|
||||||
|
print(latitude);
|
||||||
|
print(latitude);
|
||||||
|
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}';
|
||||||
|
}
|
||||||
|
|
||||||
|
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.location].request();
|
||||||
|
return permissionResults;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue