封装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
的派生类
基本使用
可以看到传入一个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的使用等着我们去探索。