Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

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 ネットワーキングの実装

目次

設定とパーミッション

ネットワークアクセスに必要な環境とプラットフォーム固有のパーミッションを設定します。

  1. ターミナルから http パッケージ依存関係を追加します:
    flutter pub add http
    
  2. Dart ファイルでパッケージをインポートします:
    import 'package:http/http.dart' as http;
    
  3. android/app/src/main/AndroidManifest.xml にインターネットパーミッションを追加して Android パーミッションを設定します:
    <uses-permission android:name="android.permission.INTERNET" />
    
  4. macos/Runner/DebugProfile.entitlementsmacos/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:convertjsonEncode() を使用してボディをエンコードします。
  • ステータス検証: 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.hasDatasnapshot.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

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: flutter · flutter/skills · ライセンス: BSD-3-Clause