You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中是否存在Model映射HTTP请求的便捷方案或库?

解决方案

在Flutter开发中,你可以通过json_serializable结合网络库封装,或者使用retrofit这类注解式框架来实现Model与HTTP请求的自动序列化/反序列化,完全替代手动编码解析的工作。

方案一:json_serializable + Dio 自定义封装

这是灵活度较高的方案,适合需要自定义网络逻辑的场景:

  1. 配置依赖
    在pubspec.yaml中添加依赖:
dependencies:
  dio: ^5.0.0
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0
  1. 给TestModel添加序列化注解
    创建test_model.dart:
import 'package:json_annotation/json_annotation.dart';

part 'test_model.g.dart';

@JsonSerializable()
class TestModel {
  final String id;
  final String name;
  final int age;

  TestModel({required this.id, required this.name, required this.age});

  // 从JSON解析成Model
  factory TestModel.fromJson(Map<String, dynamic> json) => _$TestModelFromJson(json);

  // 将Model转成JSON
  Map<String, dynamic> toJson() => _$TestModelToJson(this);
}

运行命令生成序列化代码:

flutter pub run build_runner build
  1. 封装网络工具类
    创建network_service.dart,实现通用的Model请求方法:
import 'package:dio/dio.dart';
import 'test_model.dart';

class NetworkService {
  final Dio _dio = Dio(BaseOptions(baseUrl: "https://your-api-base-url.com"));

  // POST请求:传入Model,返回解析后的Model
  Future<T> postModelRequest<T>(
    String path,
    Object model,
    T Function(Map<String, dynamic>) fromJson,
  ) async {
    try {
      final response = await _dio.post(
        path,
        data: (model as dynamic).toJson(),
      );
      return fromJson(response.data);
    } catch (e) {
      rethrow;
    }
  }

  // GET请求:返回解析后的Model
  Future<T> getModelRequest<T>(
    String path,
    T Function(Map<String, dynamic>) fromJson, {
    Map<String, dynamic>? queryParameters,
  }) async {
    try {
      final response = await _dio.get(
        path,
        queryParameters: queryParameters,
      );
      return fromJson(response.data);
    } catch (e) {
      rethrow;
    }
  }

  // 同理可封装PATCH、PUT等方法
}
  1. 使用示例
void main() async {
  final networkService = NetworkService();
  
  final testModel = TestModel(id: "1", name: "John", age: 25);
  final responseModel = await networkService.postModelRequest(
    "/test",
    testModel,
    TestModel.fromJson,
  );
  
  print(responseModel.name);
}

方案二:使用Retrofit注解式框架

如果偏好声明式API写法,retrofit会自动生成请求和解析代码,更简洁:

  1. 配置依赖
dependencies:
  dio: ^5.0.0
  retrofit: ^4.0.1
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  retrofit_generator: ^7.0.2
  json_serializable: ^6.7.0
  1. 定义API接口和Model
// test_model.dart 内容同方案一

// api_service.dart
import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';
import 'test_model.dart';

part 'api_service.g.dart';

@RestApi(baseUrl: "https://your-api-base-url.com")
abstract class ApiService {
  factory ApiService(Dio dio, {String baseUrl}) = _ApiService;

  @POST("/test")
  Future<TestModel> createTestModel(@Body() TestModel model);

  @GET("/test/{id}")
  Future<TestModel> getTestModel(@Path("id") String id);

  @PATCH("/test/{id}")
  Future<TestModel> updateTestModel(@Path("id") String id, @Body() TestModel model);
}
  1. 生成代码并使用
    运行命令生成代码:
flutter pub run build_runner build

调用示例:

void main() async {
  final dio = Dio();
  final apiService = ApiService(dio);
  
  final testModel = TestModel(id: "1", name: "John", age: 25);
  final responseModel = await apiService.createTestModel(testModel);
  
  print(responseModel.age);
}

两种方案都能实现你想要的“传入Model完成请求并返回Model”的需求,前者灵活可控,后者简洁高效,可根据项目需求选择。

内容的提问来源于stack exchange,提问作者Vedo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:35:23