Flutter中是否存在Model映射HTTP请求的便捷方案或库?
解决方案
在Flutter开发中,你可以通过json_serializable结合网络库封装,或者使用retrofit这类注解式框架来实现Model与HTTP请求的自动序列化/反序列化,完全替代手动编码解析的工作。
方案一:json_serializable + Dio 自定义封装
这是灵活度较高的方案,适合需要自定义网络逻辑的场景:
- 配置依赖
在pubspec.yaml中添加依赖:
dependencies: dio: ^5.0.0 json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.0
- 给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
- 封装网络工具类
创建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等方法 }
- 使用示例
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会自动生成请求和解析代码,更简洁:
- 配置依赖
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
- 定义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); }
- 生成代码并使用
运行命令生成代码:
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
相关产品推荐
相关产品推荐

