flutter-handling-http-and-json by flutter/skills
npx skills add https://github.com/flutter/skills --skill flutter-handling-http-and-jsonnetwork_security_config.xml(Android)和 NSAppTransportSecurity(iOS)。Uri.https(authority, unencodedPath, [queryParameters]) 来安全地构建 URL。这能可靠地处理编码和格式化,防止字符串拼接错误。http.Response.statusCode。将 200(OK)和 201(Created)视为成功。对于其他状态码,抛出明确的异常(不要返回 null)。广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
compute() 函数。application/json,来强制输出可靠的 JSON。使用此工作流来实现基于 http 包的网络请求。
任务进度:
http 包添加到 pubspec.yaml。AndroidManifest.xml 中的互联网权限和 macOS .entitlements)。Uri。条件实现:
http.get(uri)。http.post(uri, headers: {...}, body: jsonEncode(data))。确保 Content-Type 为 application/json; charset=UTF-8。http.put(uri, headers: {...}, body: jsonEncode(data))。http.delete(uri, headers: {...})。反馈循环:验证与错误处理
response.statusCode。200 或 201,调用 jsonDecode(response.body) 并映射到 Dart 对象。Exception('Failed to load/update/delete resource')。根据项目复杂性选择序列化策略。
条件实现:
dart:convert 进行手动序列化。json_serializable 进行代码生成。任务进度:
dart:convert。final 属性定义 Model 类。factory Model.fromJson(Map<String, dynamic> json) 构造函数。Map<String, dynamic> toJson() 方法。json_serializable)任务进度:
flutter pub add json_annotation 和 flutter pub add -d build_runner json_serializable。json_annotation.dart。part 'model_name.g.dart'; 指令。@JsonSerializable() 注解类。如果类包含嵌套模型,请使用 explicitToJson: true。fromJson 工厂构造函数和 toJson 方法。dart run build_runner build --delete-conflicting-outputs。使用此工作流来防止解析大型 JSON 负载(例如,包含 1000 多个项目的列表)时出现掉帧。
任务进度:
String(响应体)并返回解析后的 Dart 对象(例如 List<Model>)。jsonDecode 并将结果映射到 Model 类。response.body 传递给 Flutter 的 compute() 函数。import 'dart:convert';
import 'package:http/http.dart' as http;
class Album {
final int id;
final String title;
const Album({required this.id, required this.title});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
id: json['id'] as int,
title: json['title'] as String,
);
}
}
Future<Album> fetchAlbum() async {
final uri = Uri.https('jsonplaceholder.typicode.com', '/albums/1');
final response = await http.get(uri);
if (response.statusCode == 200) {
return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else {
throw Exception('Failed to load album');
}
}
Future<Album> createAlbum(String title) async {
final uri = Uri.https('jsonplaceholder.typicode.com', '/albums');
final response = await http.post(
uri,
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'title': title}),
);
if (response.statusCode == 201) {
return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else {
throw Exception('Failed to create album.');
}
}
compute 进行后台解析import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
// 1. 用于解析的顶级函数
List<Photo> parsePhotos(String responseBody) {
final parsed = (jsonDecode(responseBody) as List<Object?>)
.cast<Map<String, Object?>>();
return parsed.map<Photo>(Photo.fromJson).toList();
}
// 2. 使用 compute 的获取函数
Future<List<Photo>> fetchPhotos(http.Client client) async {
final uri = Uri.https('jsonplaceholder.typicode.com', '/photos');
final response = await client.get(uri);
if (response.statusCode == 200) {
// 在单独的隔离区中运行 parsePhotos
return compute(parsePhotos, response.body);
} else {
throw Exception('Failed to load photos');
}
}
json_serializable)import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable(explicitToJson: true)
class User {
final String name;
@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;
User(this.name, this.registrationDateMillis);
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
每周安装量
1.7K
代码仓库
GitHub 星标数
784
首次出现
11 天前
安全审计
已安装于
codex1.7K
gemini-cli1.7K
opencode1.7K
github-copilot1.7K
kimi-cli1.7K
cursor1.7K
network_security_config.xml (Android) and NSAppTransportSecurity (iOS).Uri.https(authority, unencodedPath, [queryParameters]) to safely build URLs. This handles encoding and formatting reliably, preventing string concatenation errors.http.Response.statusCode. Treat 200 (OK) and 201 (Created) as success. Throw explicit exceptions for other codes (do not return null).compute() function.application/json.Use this workflow to implement network requests using the http package.
Task Progress:
http package to pubspec.yaml.AndroidManifest.xml and macOS .entitlements).Uri.Conditional Implementation:
http.get(uri).http.post(uri, headers: {...}, body: jsonEncode(data)). Ensure Content-Type is application/json; charset=UTF-8.http.put(uri, headers: {...}, body: jsonEncode(data)).http.delete(uri, headers: {...}).Feedback Loop: Validation & Error Handling
response.statusCode.200 or 201, call jsonDecode(response.body) and map to a Dart object.Exception('Failed to load/update/delete resource').Choose the serialization strategy based on project complexity.
Conditional Implementation:
dart:convert.json_serializable.Task Progress:
dart:convert.final properties.factory Model.fromJson(Map<String, dynamic> json) constructor.Map<String, dynamic> toJson() method.json_serializable)Task Progress:
flutter pub add json_annotation and flutter pub add -d build_runner json_serializable.json_annotation.dart in the model file.part 'model_name.g.dart'; directive.@JsonSerializable(). Use explicitToJson: true if the class contains nested models.fromJson factory and toJson method delegating to the generated functions.dart run build_runner build --delete-conflicting-outputs.Use this workflow to prevent frame drops when parsing large JSON payloads (e.g., lists of 1000+ items).
Task Progress:
String (the response body) and returns the parsed Dart object (e.g., List<Model>).jsonDecode and map the results to the Model class.response.body to Flutter's compute() function.import 'dart:convert';
import 'package:http/http.dart' as http;
class Album {
final int id;
final String title;
const Album({required this.id, required this.title});
factory Album.fromJson(Map<String, dynamic> json) {
return Album(
id: json['id'] as int,
title: json['title'] as String,
);
}
}
Future<Album> fetchAlbum() async {
final uri = Uri.https('jsonplaceholder.typicode.com', '/albums/1');
final response = await http.get(uri);
if (response.statusCode == 200) {
return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else {
throw Exception('Failed to load album');
}
}
Future<Album> createAlbum(String title) async {
final uri = Uri.https('jsonplaceholder.typicode.com', '/albums');
final response = await http.post(
uri,
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: jsonEncode(<String, String>{'title': title}),
);
if (response.statusCode == 201) {
return Album.fromJson(jsonDecode(response.body) as Map<String, dynamic>);
} else {
throw Exception('Failed to create album.');
}
}
computeimport 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
// 1. Top-level function for parsing
List<Photo> parsePhotos(String responseBody) {
final parsed = (jsonDecode(responseBody) as List<Object?>)
.cast<Map<String, Object?>>();
return parsed.map<Photo>(Photo.fromJson).toList();
}
// 2. Fetch function using compute
Future<List<Photo>> fetchPhotos(http.Client client) async {
final uri = Uri.https('jsonplaceholder.typicode.com', '/photos');
final response = await client.get(uri);
if (response.statusCode == 200) {
// Run parsePhotos in a separate isolate
return compute(parsePhotos, response.body);
} else {
throw Exception('Failed to load photos');
}
}
json_serializable)import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
@JsonSerializable(explicitToJson: true)
class User {
final String name;
@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;
User(this.name, this.registrationDateMillis);
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
Weekly Installs
1.7K
Repository
GitHub Stars
784
First Seen
11 days ago
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
codex1.7K
gemini-cli1.7K
opencode1.7K
github-copilot1.7K
kimi-cli1.7K
cursor1.7K
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
102,200 周安装
AI智能体长期记忆系统 - 精英级架构,融合6种方法,永不丢失上下文
1,200 周安装
AI新闻播客制作技能:实时新闻转对话式播客脚本与音频生成
1,200 周安装
Word文档处理器:DOCX创建、编辑、分析与修订痕迹处理全指南 | 自动化办公解决方案
1,200 周安装
React Router 框架模式指南:全栈开发、文件路由、数据加载与渲染策略
1,200 周安装
Nano Banana AI 图像生成工具:使用 Gemini 3 Pro 生成与编辑高分辨率图像
1,200 周安装
SVG Logo Designer - AI 驱动的专业矢量标识设计工具,生成可缩放品牌标识
1,200 周安装