【Flutter】ライブラリ紹介 Dio

Flutter

Dioは、DartおよびFlutter用の強力なHTTPネットワーキングパッケージであり、グローバル構成、インターセプター、FormData、リクエストのキャンセル、ファイルのアップロード/ダウンロード、タイムアウト、カスタムアダプター、トランスフォーマーなどをサポートしています。

インストール

dioパッケージをpubspec.yamlのdependenciesに追加してください。

dependencies:
  dio: ^5.3.3

パッケージをアップデートする前に、メジャーバージョンやマイナーバージョンの変更で破壊的な変更がある可能性があるので、Migration Guideを確認してください。

使用例

以下は、シンプルなGETリクエストの例です。

import 'package:dio/dio.dart';

final dio = Dio();

void getHttp() async {
  final response = await dio.get('https://dart.dev');
  print(response);
}

Dioの特徴

  • 強力なHTTPネットワーキングパッケージ
  • Dart 3対応
  • FlutterプラットフォームおよびDartプラットフォーム向け
  • Android、iOS、Linux、macOS、Web、Windowsをサポート

サンプルコード

以下は、いくつかの一般的な操作のサンプルコードです。

GETリクエストの実行

import 'package:dio/dio.dart';

final dio = Dio();

void request() async {
  Response response;
  response = await dio.get('/test?id=12&name=dio');
  print(response.data.toString());

  // 上記のリクエストと同じです。
  response = await dio.get(
    '/test',
    queryParameters: {'id': 12, 'name': 'dio'},
  );
  print(response.data.toString());
}

POSTリクエストの実行

response = await dio.post('/test', data: {'id': 12, 'name': 'dio'});

ファイルのダウンロード

response = await dio.download(
  'https://pub.dev/',
  (await getTemporaryDirectory()).path + 'pub.html',
);

アップロードの進捗監視

final response = await dio.post(
  'https://www.dtworkroom.com/doris/1/2.0.0/test',
  data: {'aa': 'bb' * 22},
  onSendProgress: (int sent, int total) {
    print('$sent $total');
  },
);

これは一部のDioの機能とサンプルコードの一部です。Dioは非常に柔軟で機能豊富なHTTPパッケージであり、様々なシナリオに対応しています。詳細な使い方や機能については、Dioの公式ドキュメントを参照してください。

コピペで使えるRest API形式のDio


Rest API形式のDioをクラスで提供する拡張性のある実装例を以下に示します。このクラスでは、基本的なHTTPメソッド(GET、POST、PUT、DELETE)に対するリクエストを行うメソッドが含まれています。また、ベースURLや共通のヘッダー、エラーハンドリングなどの設定を柔軟に行えるようにしています。

import 'package:dio/dio.dart';

class RestApiClient {
  Dio _dio;

  // ベースURL
  final String baseUrl;

  // 共通のヘッダー
  final Map<String, dynamic> headers;

  RestApiClient({required this.baseUrl, Map<String, dynamic>? headers})
      : this.headers = headers ?? {},
        _dio = Dio(BaseOptions(baseUrl: baseUrl));

  // GETリクエスト
  Future<Response> get(String path, {Map<String, dynamic>? queryParameters}) async {
    return _dio.get(path, queryParameters: queryParameters, options: _options());
  }

  // POSTリクエスト
  Future<Response> post(String path, dynamic data) async {
    return _dio.post(path, data: data, options: _options());
  }

  // PUTリクエスト
  Future<Response> put(String path, dynamic data) async {
    return _dio.put(path, data: data, options: _options());
  }

  // DELETEリクエスト
  Future<Response> delete(String path, {dynamic data}) async {
    return _dio.delete(path, data: data, options: _options());
  }

  // 共通のリクエストオプション設定
  Options _options() {
    return Options(headers: headers);
  }
}

このクラスを使うと、次のようにしてRest API形式のリクエストを行えます。

void main() async {
  final restApiClient = RestApiClient(baseUrl: 'https://api.example.com', headers: {'Authorization': 'Bearer YOUR_TOKEN'});

  try {
    // GETリクエストの例
    final getResponse = await restApiClient.get('/users', queryParameters: {'page': 1});
    print('GET Response: ${getResponse.data}');

    // POSTリクエストの例
    final postData = {'name': 'John Doe', 'email': 'john@example.com'};
    final postResponse = await restApiClient.post('/users', postData);
    print('POST Response: ${postResponse.data}');
  } catch (e) {
    print('Error: $e');
  }
}

このようなクラスを利用することで、Rest APIへのリクエストが一貫して扱え、共通の設定やヘッダーの管理が容易になります。また、この実装は拡張性があり、必要に応じてカスタマイズや追加の機能を組み込むことができます。

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました