[flutter] 플러터 geolocator를 이용한 위치 기반 실시간 편의점 할인 정보 애플리케이션 개발

안녕하세요! 이번에는 플러터(Flutter)를 이용하여 위치 기반 실시간 편의점 할인 정보를 제공하는 애플리케이션을 개발하는 방법에 대해 알아보겠습니다.

개요

이 애플리케이션은 사용자의 현재 위치를 기반으로 주변 편의점들의 할인 정보를 실시간으로 제공합니다. 위치 정보는 플러터의 geolocator 패키지를 이용하여 가져올 수 있으며, 할인 정보는 API를 통해 제공받습니다.

준비물

앱 개발 단계

  1. 위치 권한 설정하기
    • 앱이 사용자의 위치 정보에 접근할 수 있도록 권한을 설정해야 합니다. Manifest 파일에 위치 권한을 추가합니다.
  2. 위치 정보 가져오기
    • Geolocator 패키지를 이용하여 현재 위치를 가져올 수 있습니다. getCurrentPosition 메서드를 호출하여 위치 정보를 가져옵니다.
  3. API 호출하기
    • 위치 정보가 가져와진 이후에는 해당 위치 주변의 편의점 할인 정보를 가져오기 위해 API를 호출합니다. HTTP 통신을 위해 http 패키지를 사용할 수 있습니다.
  4. 할인 정보 표시하기
    • API 응답을 파싱하여 편의점 목록과 할인 정보를 얻고, UI에 표시합니다.
  5. 실시간 업데이트
    • 위치 정보를 주기적으로 업데이트하여 사용자의 위치 기반으로 할인 정보를 실시간으로 제공할 수 있도록 구현합니다.

예시 코드

import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:http/http.dart' as http;

class ConvenienceStoreDiscountApp extends StatefulWidget {
  @override
  _ConvenienceStoreDiscountAppState createState() =>
      _ConvenienceStoreDiscountAppState();
}

class _ConvenienceStoreDiscountAppState
    extends State<ConvenienceStoreDiscountApp> {
  Position _currentPosition;
  List<ConvenienceStore> _convenienceStores = [];

  @override
  void initState() {
    super.initState();
    _getCurrentLocation();
  }

  Future<void> _getCurrentLocation() async {
    final position = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high);
    setState(() {
      _currentPosition = position;
    });
    _fetchConvenienceStoreDiscounts();
  }

  Future<void> _fetchConvenienceStoreDiscounts() async {
    final response = await http.get(
        'https://api.example.com/discounts?lat=${_currentPosition.latitude}&lng=${_currentPosition.longitude}');
    if (response.statusCode == 200) {
      setState(() {
        _convenienceStores = ConvenienceStore.fromJsonList(
            json.decode(response.body));
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('편의점 할인 정보'),
      ),
      body: Column(
        children: [
          if (_currentPosition != null)
            Text(
                '현재 위치: ${_currentPosition.latitude}, ${_currentPosition.longitude}'),
          Expanded(
            child: ListView.builder(
              itemCount: _convenienceStores.length,
              itemBuilder: (context, index) {
                return ListTile(
                  title: Text(_convenienceStores[index].name),
                  subtitle: Text(_convenienceStores[index].discount),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

class ConvenienceStore {
  final String name;
  final String discount;

  ConvenienceStore({this.name, this.discount});

  factory ConvenienceStore.fromJson(Map<String, dynamic> json) {
    return ConvenienceStore(
      name: json['name'],
      discount: json['discount'],
    );
  }

  static List<ConvenienceStore> fromJsonList(List<dynamic> jsonList) {
    return jsonList.map((json) => ConvenienceStore.fromJson(json)).toList();
  }
}

참고 자료

위의 예시 코드와 참고 자료들을 활용하여 플러터로 위치 기반 실시간 편의점 할인 정보 애플리케이션을 개발해보세요! 플러터의 다양한 기능과 패키지들을 활용하면 더욱 다양하고 풍부한 앱을 만들 수 있습니다.