Flutter용 플러그인은 Android 및 iOS에서 위치 가져오기를 처리합니다. 또한 위치가 변경될 때 콜백을 제공합니다.
pub.dev
GetX 방식
GetX에서 지원하는 서비스(Service) 방식으로 메인에서 서비스를 올리는 형태로 진행했습니다.
기본적으로 `Location`을 가져오는 과정이 조금 딜레이가 있기 때문에, 메인에서 인입될 때 별도로 처리되게끔 진행했습니다. 평균적으로 위치 정보를 가져오는 2 ~ 3초 걸리는 것 같습니다.
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:get/get.dart';
import 'package:location/location.dart';
import '../globals/global_toast_widget.dart';
/// 위치 조회 서비스
class LocationService extends GetxService {
static LocationService get to => Get.find();
/// 디바이스 정보
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
/// 위치 정보 가져오기 데이터
late final LocationData locationData;
/// 위치 정보
final Location location = Location();
/// 위치 정보 가져오기 성공 여부
RxBool serviceEnabled = false.obs;
/// 위치 정보 가져오기 권한 여부
late PermissionStatus permissionGranted;
/// 위치 정보 가져오기
Future<void> getLocation() async {
List temp = [
await Future.value(await location.serviceEnabled()),
await Future.value(await location.requestService()),
];
if (!temp[0] && !temp[1]) {
return;
}
// 권한 관련
permissionGranted = await location.hasPermission();
if (permissionGranted == PermissionStatus.denied) {
permissionGranted = await location.requestPermission();
if (permissionGranted != PermissionStatus.granted) {
return;
}
}
if (Platform.isIOS) {
IosDeviceInfo iosInfo = await deviceInfo.iosInfo;
if (iosInfo.isPhysicalDevice) {
locationData = await location.getLocation();
} else {
GlobalToastWidget(message: '에뮬레이터에서는 위치 정보를 가져올 수 없습니다.');
locationData = LocationData.fromMap({
'latitude': 37.566535,
'longitude': 126.97796919999996,
});
}
} else if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
if (androidInfo.isPhysicalDevice) {
locationData = await location.getLocation();
} else {
GlobalToastWidget(message: '에뮬레이터에서는 위치 정보를 가져올 수 없습니다.');
locationData = LocationData.fromMap({
'latitude': 37.566535,
'longitude': 126.97796919999996,
});
}
}
}
@override
void onInit() {
super.onInit();
}
@override
void onReady() {
super.onReady();
}
@override
void onClose() {
super.onClose();
}
}
728x90
사업자 정보 표시
레플라 | 홍대기 | 경기도 부천시 부일로 519 화신오피스텔 1404호 | 사업자 등록번호 : 726-04-01977 | TEL : 070-8800-6071 | Mail : support@reafla.co.kr | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기
'Dart > Flutter' 카테고리의 다른 글
[Flutter] 플러터 `Rive` 적용하기 (0) | 2022.12.23 |
---|---|
[Flutter] `TextField`, `TextFormField` 특정 포커스(Focus) 위치하기 (0) | 2022.12.23 |
[Flutter] 탭바(Tabbar) 스크롤 위치 기억하기 `Render Visible` (0) | 2022.12.23 |
[Flutter] Location `Attempt to invoke interface method 'void'` 오류 해결하기 (0) | 2022.12.21 |
[Flutter] 플러터 `notification.metrics.axis == widget.axis: is not true` 해결하기 (0) | 2022.12.15 |