Catalog
flutter/flutter-use-http-package

flutter

flutter-use-http-package

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.

global
model:models/gemini-3.1-pro-preview
last_modified:Tue, 21 Apr 2026 21:36:42 GMT
New~1.6k
v1.0Saved Jul 11, 2026

Implementing Flutter Networking

Contents

Configuration & Permissions

Configure the environment and platform-specific permissions required for network access.

  1. Add the http package dependency via the terminal:
    flutter pub add http
    
  2. Import the package in your Dart files:
    import 'package:http/http.dart' as http;
    
  3. Configure Android permissions by adding the Internet permission to android/app/src/main/AndroidManifest.xml:
    <uses-permission android:name="android.permission.INTERNET" />
    
  4. Configure macOS entitlements by adding the network client key to both macos/Runner/DebugProfile.entitlements and macos/Runner/Release.entitlements:
    <key>com.apple.security.network.client</key>
    <true/>
    

Request Execution & Response Handling

Execute HTTP operations and map responses to strongly typed Dart objects.

  • URIs: Always parse URL strings using Uri.parse('your_url').
  • Headers: Inject authorization and content-type headers via the headers parameter map. Use HttpHeaders.authorizationHeader for auth tokens.
  • Payloads: For POST and PUT requests, encode the body using jsonEncode() from dart:convert.
  • Status Validation: Evaluate response.statusCode. Treat 200 OK (GET/PUT/DELETE) and 201 CREATED (POST) as success.
  • Error Handling: Throw explicit exceptions for non-success status codes. Never return null on failure, as this prevents FutureBuilder from triggering its error state and causes infinite loading indicators.
  • Deserialization: Parse the raw string using jsonDecode(response.body) and map it to a custom Dart object using a factory constructor (e.g., fromJson).

Background Parsing

Offload expensive JSON parsing to a separate Isolate to prevent UI jank (frame drops).

  • Import package:flutter/foundation.dart.
  • Use the compute() function to run the parsing logic in a background isolate.
  • Ensure the parsing function passed to compute() is a top-level function or a static method, as closures or instance methods cannot be passed across isolates.

Workflow: Executing Network Operations

Use the following checklist to implement and validate network operations.

Task Progress:

  • 1. Define the strongly typed Dart model with a fromJson factory constructor.
  • 2. Implement the network request method returning a Future<Model>.
  • 3. Apply conditional logic based on the operation type:
    • If fetching data (GET): Append query parameters to the URI.
    • If mutating data (POST/PUT): Set 'Content-Type': 'application/json; charset=UTF-8' and attach the jsonEncode body.
    • If deleting data (DELETE): Return an empty model instance on success (200 OK).
  • 4. Validate the statusCode and throw an Exception on failure.
  • 5. Integrate the Future into the UI using FutureBuilder.
  • 6. Handle snapshot.hasData, snapshot.hasError, and default to a CircularProgressIndicator.
  • 7. Feedback Loop: Run the app -> trigger the network request -> review console for unhandled exceptions -> fix parsing or permission errors.

Examples

High-Fidelity Implementation: Fetching and Parsing in the Background

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. Top-level parsing function for 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. Network execution with background parsing
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) {
    // Offload heavy parsing to a background isolate
    return compute(parsePhotos, response.body);
  } else {
    throw Exception('Failed to load photos. Status: ${response.statusCode}');
  }
}

// 3. Strongly typed model
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 Integration
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();
    // Initialize Future once to prevent re-fetching on rebuilds
    _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}'));
        }
        
        // Default loading state
        return const Center(child: CircularProgressIndicator());
      },
    );
  }
}
Files1
1 files · 1.5 KB

Select a file to preview

Overall Score

84/100

Grade

B

Good

Safety

85

Quality

87

Clarity

82

Completeness

78

Summary

This skill teaches developers how to implement HTTP networking in Flutter using the `http` package, covering GET, POST, PUT, and DELETE requests. It provides configuration guidance for platform-specific permissions, response handling patterns, background JSON parsing with Isolates, and includes a complete end-to-end example fetching and displaying photos from a REST API with FutureBuilder integration.

Detected Capabilities

HTTP GET request executionHTTP POST/PUT/DELETE request executionJSON deserializationBackground task execution via IsolatesFile write (Android/macOS configuration)Package dependency management

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

fetch rest apihttp requests flutternetwork data parsingbackground isolate parsingflutter networking setup

Risk Signals

INFO

Token placeholder in example code ('Bearer your_token_here')

Examples section, fetchPhotos() function
INFO

Outbound HTTP request to jsonplaceholder.typicode.com (test API)

Examples section, fetchPhotos() function
WARNING

Network calls without timeout configuration

Request Execution & Response Handling section

Referenced Domains

External domains referenced in skill content, detected by static analysis.

jsonplaceholder.typicode.com

Use Cases

  • Fetch data from a REST API and display it in a Flutter UI
  • Send or mutate data via POST/PUT requests to a backend server
  • Parse large JSON responses in a background isolate to avoid UI blocking
  • Handle network errors and display appropriate error messages in the UI
  • Implement proper HTTP headers for authentication and content negotiation

Quality Notes

  • Excellent: Includes complete, production-grade example code with proper error handling and UI integration
  • Excellent: Clear distinction between GET, POST, PUT, DELETE operations with conditional logic guidance
  • Excellent: Covers platform-specific configuration (Android, macOS) with exact file paths and XML snippets
  • Good: Includes background parsing guidance using Isolates to prevent UI jank — a critical Flutter performance pattern
  • Good: Strong emphasis on error handling (never return null, throw exceptions) with FutureBuilder snapshot patterns
  • Minor: No guidance on timeout configuration, which is important for production apps
  • Minor: No guidance on certificate pinning or HTTPS validation for production APIs
  • Minor: Example uses a public test API rather than a generic example URL, which may confuse real-world usage
Model: claude-haiku-4-5-20251001Analyzed: Jul 11, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Add flutter/flutter-use-http-package to your library

Command Palette

Search for a command to run...