본문 바로가기
Dart/Flutter

[Flutter] `Location` 위치 정보 가져오기

by 검은냥냥이 2022. 12. 19.

Flutter용 플러그인은 Android 및 iOS에서 위치 가져오기를 처리합니다. 또한 위치가 변경될 때 콜백을 제공합니다.

 

pub.dev

 

location | Flutter Package

A Flutter plugin to easily handle realtime location in iOS and Android. Provides settings for optimizing performance or battery.

pub.dev

 

 

device_info_plus | Flutter Package

Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on.

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 | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기