دریافت موقعیت کاربر در Flutter
یکی از مواردی که در طراحی اپلیکیشن ممکن است به آن نیاز داشته باشیم دریافت موقعیت مکانی کاربر به وسیله GPS می باشد.
در این مطلب نحوه دریافت موقعیت با استفاده از پلاگین Geolocator را در فلاتر بررسی میکنیم.
به همین منظور وارد فایل pubspec.yaml شوید و پکیج مورد نظر را به برنامه اضافه کنید.
dependencies:
flutter: sdk:
flutter geolocator: ^5.1.3
برای استفاده از GPS نیاز داریم تا سطح دسترسی آن را به هردو پلتفرم اندروید و iOS اضافه کنیم
iOS Permissions
ابتدا وارد مسیر ios/Runner/Info.plist شوید و جفت مقدار های key/value را به آن اضافه کنید.
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs access to location when in the background.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs access to location when open and in the background.</string>
اگر نمیخواهید برنامه خود را روی iOS نسخه ۱۰ و کمتر اجرا کنید و یا زمانی که اپلیکیشن در حال استفاده نیست لوکیشن را دریافت کنید میتونید از دو عبارت زیر صرف نظر کنید.
NSLocationAlwaysUsageDescription
NSLocationAlwaysAndWhenInUseUsageDescription
Android Permissions
برای اضافه کردن سطح دسترسی ها به اندروید وارد فایل AndroidManifest.xml شوید و دسترسی های زیر را در آن قبل از تگ application اضافه کنید.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
در ادامه فایل main.dart را به شکل زیر ویرایش میکنیم تا صفحه home ایی که ساختیم نمایش داده شود.
import 'package:flutter/material.dart';
import 'home_page.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
ویجت HomePage ما به شکل زیر هست.
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Location"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FlatButton(
child: Text("Get location"),
onPressed: () {
// Get location here
},
),
],
),
),
);
}
}
دریافت موقعیت کنونی کاربر
تا به اینجا موارد پایه ای را در اپلیکیشن خودمون طراحی کردیم حالا قصد داریم ویجت HomePage را ویرایش کنیم تا موقعیت کاربر را بتوانیم دریافت کنیم.
میتونیم این کار با ساختن یک نمونه از Geolocator و صدا زدن متد getCurrentPosition انجام دهیم.
این متد به کاربر درخواستی ارسال میکند مبتنی بر این که آیا مایل است که اپلیکیشن به موقعیت مکانی آن دسترسی پیدا کند یا خیر.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:geolocator/geolocator.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
Position _currentPosition;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Location"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (_currentPosition != null)
Text(
"LAT: ${_currentPosition.latitude}, LNG: ${_currentPosition.longitude}"),
FlatButton(
child: Text("Get location"),
onPressed: () {
_getCurrentLocation();
},
),
],
),
),
);
}
_getCurrentLocation() {
final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
geolocator
.getCurrentPosition(desiredAccuracy: LocationAccuracy.best)
.then((Position position) {
setState(() {
_currentPosition = position;
});
}).catchError((e) {
print(e);
});
}
}
اگر همه چیز مرتب باشد باید بتونید این مقادیر latitude و longitude را بروی صفحه اپلیکیشن ببینید.
تبدیل موقعیت به آدرس
با استفاده موقعیت مکانی و طول و عرض جغرافیایی که بدست آوردیم میتونیم بصورت تقریبی آدرس کاربر را نیز بدست آوریم.
برای این کار از متد _getAddressFromLatLng() استفاده میکنیم.
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:geolocator/geolocator.dart';
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
Position _currentPosition;
String _currentAddress;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Location"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (_currentPosition != null) Text(_currentAddress),
FlatButton(
child: Text("Get location"),
onPressed: () {
_getCurrentLocation();
},
),
],
),
),
);
}
_getCurrentLocation() {
geolocator
.getCurrentPosition(desiredAccuracy: LocationAccuracy.best)
.then((Position position) {
setState(() {
_currentPosition = position;
});
_getAddressFromLatLng();
}).catchError((e) {
print(e);
});
}
_getAddressFromLatLng() async {
try {
List<Placemark> p = await geolocator.placemarkFromCoordinates(
_currentPosition.latitude, _currentPosition.longitude);
Placemark place = p[0];
setState(() {
_currentAddress =
"${place.locality}, ${place.postalCode}, ${place.country}";
});
} catch (e) {
print(e);
}
}
}
نتیجه کار شما باید بصورت زیر باشد.
دیدگاهتان را بنویسید