Skip to content

封装dio框架实现的dart版本的retrofit,使编写网络接口类似原生Android开发中的Retrofit框架 pubdev地址:https://pub.dev/packages/retrofit

添加依赖

yaml
dependencies:
  retrofit: '>=4.0.0 <5.0.0'
  json_annotation: ^4.8.1

dev_dependencies:
  # required dart >=2.19
  retrofit_generator: '>=7.0.0 <8.0.0'
  build_runner: '>=2.3.0 <4.0.0'
  json_serializable: ^6.6.2

编写实体类

dart
@JsonSerializable()
class HospitalEntity {
	String? msg = '';
	int? code = 0;
	HospitalPage? page;

	HospitalEntity();

	factory HospitalEntity.fromJson(Map<String, dynamic> json) => $HospitalEntityFromJson(json);

	Map<String, dynamic> toJson() => $HospitalEntityToJson(this);

	@override
	String toString() {
		return jsonEncode(this);
	}
}

@JsonSerializable()
class HospitalPage {
	int? totalCount = 0;
	int? pageSize = 0;
	int? totalPage = 0;
	int? currPage = 0;
	List<HospitalPageList>? list = [];

	HospitalPage();

	factory HospitalPage.fromJson(Map<String, dynamic> json) => $HospitalPageFromJson(json);

	Map<String, dynamic> toJson() => $HospitalPageToJson(this);

	@override
	String toString() {
		return jsonEncode(this);
	}
}

@JsonSerializable()
class HospitalPageList {
	int? ysId = 0;
	String? ysName = '';
	String? ysSex = '';
	String? ysKs = '';
	String? ysPhone = '';
	String? ysPassword = '';
	String? ysBirthDate = '';
	String? ysCreateDate = '';
	dynamic ysImg;

	HospitalPageList();

	factory HospitalPageList.fromJson(Map<String, dynamic> json) => $HospitalPageListFromJson(json);

	Map<String, dynamic> toJson() => $HospitalPageListToJson(this);

	@override
	String toString() {
		return jsonEncode(this);
	}
}

请求接口

编写的时候有几个注意事项:

  • part 'service.g.dart';使用的是part,它不同于import。(可以单独学习一下他他们的区别)
  • @RestApi注解使用在类上,使用baseUrl指定网络请求的统一URL
  • 使用factory修饰构造方法,使用了工厂方法,并且赋值为_当前类的类名,这个类是等会生成出来的,是RestClient的派生类

具体的接口的编写方法和Android原生开发中的写法类似,也引用了很多的注解。

yaml
import 'package:dio/dio.dart';
import 'package:retrofit/retrofit.dart';

import '../model/hospital_entity.dart';

part 'service.g.dart';

@RestApi(baseUrl: 'http://8.130.124.187:8080/renren-fast')
abstract class RestClient {
  factory RestClient(Dio dio, {String baseUrl}) = _RestClient;

  @GET('/hospital/ys/list')
  Future<HospitalEntity> getHospitalInfo(@Query('params') int params);
}

编译生成代码

powershell
# dart
dart pub run build_runner build

# flutter	
flutter pub run build_runner build

// 个人更建议使用 watch 命令
// 该命令监听输入,可以实时编译最新的代码,不用每次修改之后重复使用 build 了
flutter pub run build_runner watch

编译完成后,可以看到生成了一个xxx.g.dart的文件,并且里面的类就是RestClient的派生类 image.png

基本使用

可以看到传入一个dio实例,创建一个RestClient,然后通过它调用具体的接口 仅从表层使用上可以和原生的Android网络请求类比:dio就像是okhttp,flutter中的Retrofit是封装了dio,而原生中的Retrofit框架封装了okhttp。

dart
_getByRetrofit() async{
  // final Dio dio=Dio();
  var client=RestClient(dio);
  client.getHospitalInfo(1).then((value) => print(value.toString()));
}

结合FlutterJsonBeanFactory

在编写实体类的时候,有没有类似原生开发中的JsonToKotlinClass,将Json格式的数据转换为数据实体? 当然是有的,那就是FlutterJsonBeanFactory,具体的使用详看Json数据解析

总结

使用Retrofit+FlutterJsonBeanFactory就能让我们在Flutter中编写网络请求如原生开发一样丝滑,更多Retrofit的使用等着我们去探索。