flutter-use-http-package
REST APIへのデータ取得・送信が必要な場合に、`http`パッケージを使用してGET、POST、PUT、DELETEリクエストを実行します。
description の原文を見る
Use the `http` package to execute GET, POST, PUT, or DELETE requests. Use when you need to fetch from or send data to a REST API.
SKILL.md 本文
Flutter ネットワーキングの実装
目次
設定とパーミッション
ネットワークアクセスに必要な環境とプラットフォーム固有のパーミッションを設定します。
- ターミナルから
httpパッケージ依存関係を追加します:flutter pub add http - Dart ファイルでパッケージをインポートします:
import 'package:http/http.dart' as http; android/app/src/main/AndroidManifest.xmlにインターネットパーミッションを追加して Android パーミッションを設定します:<uses-permission android:name="android.permission.INTERNET" />macos/Runner/DebugProfile.entitlementsとmacos/Runner/Release.entitlementsの両方にネットワーククライアントキーを追加して macOS エンタイトルメントを設定します:<key>com.apple.security.network.client</key> <true/>
リクエスト実行とレスポンス処理
HTTP 操作を実行し、レスポンスを厳密に型付けされた Dart オブジェクトにマップします。
- URI: URL 文字列を
Uri.parse('your_url')を使用して常にパースします。 - ヘッダー:
headersパラメータマップを通じて認可およびコンテンツタイプヘッダーを注入します。認証トークンにはHttpHeaders.authorizationHeaderを使用します。 - ペイロード: POST および PUT リクエストの場合、
dart:convertのjsonEncode()を使用してボディをエンコードします。 - ステータス検証:
response.statusCodeを評価します。200 OK(GET/PUT/DELETE)と201 CREATED(POST)を成功として扱います。 - エラーハンドリング: 成功以外のステータスコードに対して明示的な例外をスローします。失敗時に
nullを返さないでください。これによりFutureBuilderがエラー状態をトリガーせず、無限ローディングインジケータが発生します。 - デシリアライゼーション:
jsonDecode(response.body)を使用して生の文字列をパースし、ファクトリコンストラクタ(例えばfromJson)を使用して、カスタム Dart オブジェクトにマップします。
バックグラウンドパース
UI がカクつく(フレームドロップ)のを防ぐために、高い負荷の JSON パースを別の Isolate にオフロードします。
package:flutter/foundation.dartをインポートします。compute()関数を使用して、パース ロジックをバックグラウンド Isolate で実行します。compute()に渡されるパース関数は、トップレベル関数または静的メソッドである必要があります。クロージャーまたはインスタンスメソッドは Isolate 間で渡すことができないためです。
ワークフロー: ネットワーク操作の実行
ネットワーク操作を実装して検証するには、以下のチェックリストを使用してください。
タスク進捗:
- 1.
fromJsonファクトリコンストラクタを持つ厳密に型付けされた Dart モデルを定義します。 - 2.
Future<Model>を返すネットワークリクエストメソッドを実装します。 - 3. 操作タイプに基づいて条件付きロジックを適用します:
- データフェッチの場合(GET): URI にクエリパラメータを追加します。
- データ変更の場合(POST/PUT):
'Content-Type': 'application/json; charset=UTF-8'を設定し、jsonEncodeボディをアタッチします。 - データ削除の場合(DELETE): 成功時(
200 OK)に空のモデルインスタンスを返します。
- 4.
statusCodeを検証し、失敗時にExceptionをスローします。 - 5.
FutureBuilderを使用してFutureを UI に統合します。 - 6.
snapshot.hasData、snapshot.hasErrorを処理し、デフォルトでCircularProgressIndicatorに設定します。 - 7. フィードバックループ: アプリを実行 → ネットワークリクエストをトリガー → コンソールでハンドルされていない例外を確認 → パースまたはパーミッションエラーを修正します。
例
高忠実度の実装: バックグラウンドでのフェッチとパース
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
// 1. Isolate 用のトップレベルパース関数
List<Photo> parsePhotos(String responseBody) {
final parsed = (jsonDecode(responseBody) as List<Object?>)
.cast<Map<String, Object?>>();
return parsed.map<Photo>(Photo.fromJson).toList();
}
// 2. バックグラウンドパース付きネットワーク実行
Future<List<Photo>> fetchPhotos() async {
final response = await http.get(
Uri.parse('https://jsonplaceholder.typicode.com/photos'),
headers: {
HttpHeaders.authorizationHeader: 'Bearer your_token_here',
HttpHeaders.acceptHeader: 'application/json',
},
);
if (response.statusCode == 200) {
// 重い処理をバックグラウンド Isolate にオフロード
return compute(parsePhotos, response.body);
} else {
throw Exception('Failed to load photos. Status: ${response.statusCode}');
}
}
// 3. 厳密に型付けされたモデル
class Photo {
final int id;
final String title;
final String thumbnailUrl;
const Photo({
required this.id,
required this.title,
required this.thumbnailUrl,
});
factory Photo.fromJson(Map<String, dynamic> json) {
return Photo(
id: json['id'] as int,
title: json['title'] as String,
thumbnailUrl: json['thumbnailUrl'] as String,
);
}
}
// 4. UI 統合
class PhotoGallery extends StatefulWidget {
const PhotoGallery({super.key});
@override
State<PhotoGallery> createState() => _PhotoGalleryState();
}
class _PhotoGalleryState extends State<PhotoGallery> {
late Future<List<Photo>> _futurePhotos;
@override
void initState() {
super.initState();
// リビルド時の再フェッチを防ぐために Future を一度だけ初期化
_futurePhotos = fetchPhotos();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<Photo>>(
future: _futurePhotos,
builder: (context, snapshot) {
if (snapshot.hasData) {
final photos = snapshot.data!;
return ListView.builder(
itemCount: photos.length,
itemBuilder: (context, index) => ListTile(
leading: Image.network(photos[index].thumbnailUrl),
title: Text(photos[index].title),
),
);
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
}
// デフォルトローディング状態
return const Center(child: CircularProgressIndicator());
},
);
}
}
ライセンス: BSD-3-Clause(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- flutter
- リポジトリ
- flutter/skills
- ライセンス
- BSD-3-Clause
- 最終更新
- 不明
Source: https://github.com/flutter/skills / ライセンス: BSD-3-Clause
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。