개발을 시작하는 이야기

Location_Provider 만들기 본문

개발 이야기/Flutter

Location_Provider 만들기

Teiresias 2024. 7. 1. 09:39

Flutter에서 새로운 프로젝트를 진행하는데, 위치 기반 음성 녹음을 남기는 기능을 구현중에 있다.

이전에는 Location을 담당하는 클래스로 관리했었다면 이제는Provider를 만들어서 관리하게 되었다.

아직은 Provider에 익숙해지고 있는 과정중에 있기 떄문에 재대로 작성되지 않을수 있으니 누구든 지나가는 길에 문제가 보인다면 알려주시면 감사하겠습니다.


일단 지도는 Google Map을, 위치 정보는 Location을 활용하였다.

 

일댄 새로이 location_provider.dart 파일을 만들어 위치상태 확인을 위한 Provider를 정의해 주었다.

final locationProvider = StateNotifierProvider<LocationNotifier, LatLng?>((ref) {
  return LocationNotifier();
});

 

 

일단 현 상황에서 내가 원하는것은 위치정보를 얻어올때, 권한을 확인해서 권한을 요청하거나 위치를 반환하는 간단한 동작들이다.

그래서 서비스 활성화 확인, 권환 확인을 하고 위치를 반환하는 간단한 provider를 작성했다.

  Future<void> _getLocation() async {
    bool _serviceEnabled;
    PermissionStatus _permissionGranted;
    
    _serviceEnabled = await _location.serviceEnabled();
    if (!_serviceEnabled) {
      _serviceEnabled = await _location.requestService();
      if (!_serviceEnabled) {
        return;
      }
    }
    
    _permissionGranted = await _location.hasPermission();
    if (_permissionGranted == PermissionStatus.denied) {
      _permissionGranted = await _location.requestPermission();
      if (_permissionGranted != PermissionStatus.granted) {
        return;
      }
    }
    
    _location.onLocationChanged.listen((LocationData currentLocation) {
      state = LatLng(currentLocation.latitude!, currentLocation.longitude!);
    });
  }

 

 

그러고 사용할때는 다음과 같이 사용하면 된다.

@override
  Widget build(BuildContext context, WidgetRef ref) {
    final location = ref.watch(locationProvider);

    return Scaffold(
      appBar: AppBar(),
      body: location == null
          ? Center(child: CircularProgressIndicator())
          : GoogleMap(
        mapType: MapType.normal,
        initialCameraPosition: CameraPosition(
          target: location,
          zoom: 14.0,
        ),
      ),
    );
  }

 

Provider 전체 코드

더보기
class LocationNotifier extends StateNotifier<LatLng?> {
  LocationNotifier() : super(null) {
    _getLocation();
  }

  final Location _location = Location();

  Future<void> _getLocation() async {
    bool _serviceEnabled;
    PermissionStatus _permissionGranted;
    
    _serviceEnabled = await _location.serviceEnabled();
    if (!_serviceEnabled) {
      _serviceEnabled = await _location.requestService();
      if (!_serviceEnabled) {
        return;
      }
    }
    
    _permissionGranted = await _location.hasPermission();
    if (_permissionGranted == PermissionStatus.denied) {
      _permissionGranted = await _location.requestPermission();
      if (_permissionGranted != PermissionStatus.granted) {
        return;
      }
    }
    
    _location.onLocationChanged.listen((LocationData currentLocation) {
      state = LatLng(currentLocation.latitude!, currentLocation.longitude!);
    });
  }
}

 

 

 

 

'개발 이야기 > Flutter' 카테고리의 다른 글

Flutter에서 Supabase 사용하기 01  (0) 2024.06.20
Flutter의 Freezed 사용하기  (0) 2024.06.19
Flutter의 Hooks 사용하기 02  (0) 2024.06.18
Flutter의 Hooks 사용하기 01  (0) 2024.06.17
Flutter의 상태관리 02  (0) 2024.06.16