proxibuy_bussiness/lib/presentation/pages/osm_map_picker_page.dart

118 lines
3.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart';
import 'package:geolocator/geolocator.dart';
class OsmMapPickerPage extends StatefulWidget {
const OsmMapPickerPage({super.key});
@override
State<OsmMapPickerPage> createState() => _OsmMapPickerPageState();
}
class _OsmMapPickerPageState extends State<OsmMapPickerPage> {
LatLng _pickedLocation = const LatLng(32.649704, 51.668222);
final MapController _mapController = MapController();
@override
void initState() {
super.initState();
_moveToCurrentLocation();
}
Future<void> _moveToCurrentLocation() async {
try {
LocationPermission permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied ||
permission == LocationPermission.deniedForever) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied ||
permission == LocationPermission.deniedForever) {
return;
}
}
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
setState(() {
_pickedLocation = LatLng(position.latitude, position.longitude);
_mapController.move(_pickedLocation, 15.0);
});
} catch (e) {
print("Error getting location: $e");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("موقعیت را روی نقشه مشخص کنید"),
actions: [
IconButton(
icon: const Icon(Icons.my_location),
onPressed: () {
_moveToCurrentLocation();
},
),
],
),
body: Stack(
children: [
FlutterMap(
mapController: _mapController,
options: MapOptions(
initialCenter: _pickedLocation,
initialZoom: 13.0,
onTap: (tapPosition, point) {
setState(() {
_pickedLocation = point;
});
},
),
children: [
TileLayer(
urlTemplate: 'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
userAgentPackageName: 'com.example.app', // نام پکیج برنامه شما
),
MarkerLayer(
markers: [
Marker(
width: 80.0,
height: 80.0,
point: _pickedLocation,
child: const Icon(
Icons.location_on,
color: Colors.red,
size: 50.0,
),
),
],
),
],
),
Positioned(
bottom: 30,
left: 50,
right: 50,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 15),
),
onPressed: () {
Navigator.of(context).pop(_pickedLocation);
},
child: const Text("تایید این موقعیت"),
),
),
],
),
);
}
}