[flutter] dio_retry 패키지를 사용하여 API 호출 시 로딩 상태 표시하기

이번 포스트에서는 Flutter 앱에서 API 호출 시 로딩 상태를 표시하는 방법에 대해 알아보겠습니다. 우리는 dio_retry 패키지를 사용하여 API 호출을 수행하고, 그 동안 로딩 상태를 표시할 것입니다.

1. dio_retry 패키지 추가하기

먼저 dio_retry 패키지를 프로젝트에 추가해야 합니다. 이를 위해서 pubspec.yaml 파일을 열고 dependencies 섹션에 아래와 같이 패키지를 추가합니다.

dependencies:
  dio: ^4.0.0
  dio_retry: ^4.0.0

이제 패키지를 추가한 후에는 flutter pub get 명령어를 실행하여 의존성을 업데이트합니다.

2. API 호출과 로딩 상태 관리

다음으로, API 호출과 로딩 상태 관리를 위한 코드를 작성해야 합니다. 아래는 dio_retry 패키지를 사용하여 API 호출 및 로딩 상태 표시를 관리하는 예제 코드입니다.

import 'package:dio/dio.dart';
import 'package:dio_retry/dio_retry.dart';
import 'package:flutter/material.dart';

class ApiCallScreen extends StatefulWidget {
  @override
  _ApiCallScreenState createState() => _ApiCallScreenState();
}

class _ApiCallScreenState extends State<ApiCallScreen> {
  bool _loading = false;
  Dio _dio;

  @override
  void initState() {
    super.initState();
    _dio = Dio();
    _dio.interceptors.add(RetryInterceptor(
      dio: _dio,
      options: const RetryOptions(
        retries: 3,
      ),
    ));
  }

  Future<void> _fetchData() async {
    setState(() {
      _loading = true;
    });
    try {
      Response response = await _dio.get('https://api.example.com/data');
      // handle response data
    } catch (e) {
      // handle error
    } finally {
      setState(() {
        _loading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('API Call Example'),
      ),
      body: Center(
        child: _loading
            ? CircularProgressIndicator()
            : ElevatedButton(
                onPressed: _fetchData,
                child: Text('Fetch Data'),
              ),
      ),
    );
  }
}

위의 코드에서 _loading 변수를 사용하여 로딩 상태를 관리하고, _fetchData 함수 내에서 API를 호출할 때 로딩 상태를 설정 및 해제합니다.

이제 위의 코드를 참고하여 필요한 API 호출 및 로딩 상태 관리를 수행할 수 있습니다.

3. 마무리

이제 dio_retry 패키지를 사용하여 API 호출 시 로딩 상태를 효과적으로 관리하는 방법에 대해 알아보았습니다. 이를 활용하여 Flutter 앱에서 API 호출 시 더 나은 사용자 경험을 제공할 수 있습니다.

참고: dio_retry 패키지