[flutter] 플러터(expandable)과 관련된 날씨 정보 제공 앱 개발 방법

목차

소개

이번 튜토리얼에서는 플러터와 이졀 패키지인 “expandable”을 사용하여 날씨 정보를 제공하는 앱을 개발하는 방법에 대해 알아보겠습니다. 이 앱은 사용자가 도시를 선택하고 해당 도시의 날씨 정보를 확인할 수 있으며, 상세한 날씨 정보를 확장 및 축소할 수 있는 기능을 제공합니다.

프로젝트 설정

먼저, Flutter 프로젝트를 생성하고 필요한 의존성을 추가해야 합니다.

의존성 설정

pubspec.yaml 파일을 열고 다음과 같이 의존성을 추가합니다:

dependencies:
  expandable: ^5.0.0

의존성을 추가한 후, 의존성을 업데이트하기 위해 터미널에서 flutter pub get 명령을 실행합니다.

날씨 API 연동

이제 날씨 API와 연동하여 날씨 정보를 가져올 수 있도록 설정해야 합니다. 예를 들어 “OpenWeatherMap” API를 사용한다고 가정하겠습니다. OpenWeatherMap에서 API 키를 발급받고, http 패키지를 사용하여 API 호출을 구현합니다.

import 'package:http/http.dart' as http;
import 'dart:convert';

final apiKey = 'YOUR_API_KEY';

Future<Map<String, dynamic>> getWeather(String city) async {
  var apiUrl =
      'https://api.openweathermap.org/data/2.5/weather?q=$city&appid=$apiKey';
  var response = await http.get(Uri.parse(apiUrl));
  if (response.statusCode == 200) {
    var data = jsonDecode(response.body);
    return data['weather'][0];
  } else {
    throw Exception('Failed to fetch weather');
  }
}

위의 코드는 OpenWeatherMap API를 호출하여 도시 이름을 기반으로 날씨 정보를 가져오는 함수입니다. 이 함수를 통해 날씨 정보를 가져올 수 있습니다.

UI 디자인

이제 날씨 정보를 보여줄 UI를 디자인합니다. 예를 들어, 선택한 도시의 이름, 현재 온도, 날씨 아이콘 등을 표시할 수 있습니다. UI를 디자인하는 방법은 본인의 취향에 따라 자유롭게 선택하시면 됩니다.

날씨 정보 확장 및 축소 기능 구현

expandable 패키지를 사용하여 날씨 정보를 확장하거나 축소할 수 있는 기능을 구현합니다. 예를 들어, 터치 이벤트를 통해 확장 및 축소를 할 수 있도록 하거나, 버튼을 이용하여 확장 상태를 토글할 수도 있습니다.

import 'package:flutter/material.dart';
import 'package:expandable/expandable.dart';

class WeatherDetails extends StatefulWidget {
  final String city;

  WeatherDetails({this.city});

  @override
  _WeatherDetailsState createState() => _WeatherDetailsState();
}

class _WeatherDetailsState extends State<WeatherDetails> {
  ExpandableController _expandableController;

  @override
  void initState() {
    super.initState();
    _expandableController = ExpandableController(initialExpanded: false);
  }

  @override
  Widget build(BuildContext context) {
    return ExpandablePanel(
      controller: _expandableController,
      header: Text(widget.city, style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
      expanded: FutureBuilder(
        future: getWeather(widget.city),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return CircularProgressIndicator();
          } else if (snapshot.hasData) {
            var weatherData = snapshot.data;
            return Column(
              children: [
                Text('Temperature: ${weatherData['temperature']}'),
                Text('Humidity: ${weatherData['humidity']}'),
                Text('Weather Condition: ${weatherData['condition']}'),
              ],
            );
          } else if (snapshot.hasError) {
            return Text('Failed to fetch weather data.');
          } else {
            return Text('No data available.');
          }
        },
      ),
    );
  }
}

위의 코드는 expandable 패키지를 사용하여 날씨 정보를 확장 및 축소할 수 있는 위젯을 구현한 것입니다. WeatherDetails 클래스는 선택한 도시의 날씨 정보를 표시하고, 확장 및 축소를 담당합니다.

이제 사용자가 도시를 선택하면 해당 도시의 온도, 습도, 날씨 상태 등을 볼 수 있는 날씨 정보 제공 앱이 완성되었습니다.

참고 자료