[flutter] 플러터 프로바이더를 사용한 비동기 데이터 처리

플러터(Flutter) 앱을 개발하다 보면 서버에서 데이터를 비동기적으로 가져와야 하는 상황이 많이 발생합니다. 이때 플러터 프로바이더(Provider) 패키지는 효과적으로 상태 관리와 비동기 데이터 처리를 할 수 있게 해줍니다. 이 포스트에서는 플러터 프로바이더를 사용하여 비동기 데이터를 처리하는 방법에 대해 알아보겠습니다.

Provider 패키지 설치

먼저, Provider 패키지를 프로젝트에 추가해야 합니다. pubspec.yaml 파일에 다음과 같이 패키지를 추가합니다.

dependencies:
  flutter:
    sdk: flutter
  provider: ^5.0.0

그런 다음 터미널에서 다음 명령을 실행하여 패키지를 설치합니다.

flutter pub get

모델 클래스 작성

비동기 데이터를 처리하기 위한 모델 클래스를 작성해보겠습니다. 예를 들어, 다음과 같이 Post 모델 클래스를 정의할 수 있습니다.

class Post {
  final int id;
  final String title;
  
  Post({required this.id, required this.title});

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      id: json['id'],
      title: json['title'],
    );
  }
}

데이터 가져오기

이제 Provider를 사용하여 데이터를 비동기적으로 가져오는 방법을 살펴보겠습니다. 먼저, ChangeNotifier를 상속하는 PostProvider 클래스를 작성하여 데이터 가져오기와 상태 관리를 구현합니다.

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

class PostProvider with ChangeNotifier {
  List<Post> _posts = [];

  List<Post> get posts => _posts;

  Future<void> fetchPosts() async {
    final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts'));
    if (response.statusCode == 200) {
      // 데이터 성공적으로 가져오면 상태 업데이트
      _posts = (response.body as List).map((json) => Post.fromJson(json)).toList();
      notifyListeners();
    } else {
      // 데이터 가져오기 실패시 처리
    }
  }
}

위젯에서 Provider 사용

이제 위젯에서 Provider를 사용하여 데이터를 가져오고 화면에 표시할 수 있습니다. 예를 들어, Consumer 위젯을 사용하여 PostProvider의 상태를 구독하고 UI를 업데이트할 수 있습니다.

Consumer<PostProvider>(
  builder: (context, provider, child) {
    if (provider.posts.isEmpty) {
      return CircularProgressIndicator();
    } else {
      return ListView.builder(
        itemCount: provider.posts.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(provider.posts[index].title),
          );
        },
      );
    }
  },
)

마무리

이렇게 Provider를 사용하여 플러터 앱에서 비동기 데이터를 처리하는 방법을 알아보았습니다. Provider를 효과적으로 활용하면 상태 관리와 비동기 데이터 처리를 간편하게 구현할 수 있습니다.

더 많은 정보는 공식 문서를 참고하시기 바랍니다.