Flutter Geolocation 사용기

이동언·2025년 2월 4일

현재위치에 대한 위도, 경도정보를 알기 위해서는 Geolocation을 사용해줘야함. 네이버와 같은 api를 통해 Geolocation을 사용해도 무방하지만 플러터에서 기본적으로 제공해주는 패키지를 설치해서 사용해보기로함.

1. pubspec.yaml

yaml에 다이렉트로 작성하거나 아니면 패키지 설치를 통해서 geolocator를 설치해주자.

2. Android, ios config

2-1 Android

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

android/app/src/main/androidManifest.xml 내부
Android 상단에 해당 3줄을 작성하여 넣어주자


2-2 ios

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to find nearby job postings.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>We need your location for better service.</string>

4
ios/Runner/Info/plist 파일 내부
4줄을 작성하여 넣어주자

3. LocationUtil.dart

import 'package:geolocator/geolocator.dart';

class LocationUtil {
  static Future<Position?> getCurrentLocation() async {
    bool serviceEnabled;
    LocationPermission permission;

    // 위치 서비스 활성화 확인
    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      print(" 위치 서비스가 비활성화되었습니다.");
      return null;
    }

    // 위치 권한 확인
    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.deniedForever) {
        print(" 위치 권한이 영구적으로 거부되었습니다.");
        return null;
      }
    }

    // iOS에서는 권한 확인 후 지연시간을 두고 위치 요청
    await Future.delayed(Duration(milliseconds: 500));

    // 현재 위치 가져오기
    try {
      return await Geolocator.getCurrentPosition(
        locationSettings: LocationSettings(accuracy: LocationAccuracy.high),
      );
    } catch (e) {
      print(" 위치 정보를 가져오는 중 오류 발생: $e");
      return null;
    }
  }
}

내 위치 정보를 가져오는 부분을 util로 빼놓자

4. 실제 사용

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:gooinpro_parttimer/util/LocationUtil.dart';

class JobPostings extends StatefulWidget {
  
  _JobPostingsState createState() => _JobPostingsState();
}

class _JobPostingsState extends State<JobPostings> {
  Position? _position; // 위치 저장 변수
  bool _isLoading = true; // 로딩 상태 추가

  
  void initState() {
    super.initState();
    _fetchLocation(); // 위치 정보 가져오기
  }

  Future<void> _fetchLocation() async {
    Position? position = await LocationUtil.getCurrentLocation();
    if (mounted) {
      setState(() {
        _position = position;
        _isLoading = false; // 로딩 완료
      });
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Job Postings')),
      body: Center(
        child: _isLoading
            ? CircularProgressIndicator() // 로딩 표시
            : _position != null
            ? Text("위도: ${_position!.latitude}, 경도: ${_position!.longitude}")
            : Text("위치 정보를 가져올 수 없습니다."),
      ),
    );
  }
}

현재 위치정보를 가져오는 부분을 이용해서 LocationUtil을 사용하자

0개의 댓글