flutter 网络用于HTTP的交互中, 有Http和Dio两种方式,本次侧重介绍dio的简单使用
1. flutter安装dio插件
https://pub-web.flutter-io.cn/ 中搜索dio插件使用,详细安装如下:
2. 使用
(1) 创建CancelToken对象, 可 然后采用异步的方式进行数据post(本次交互使用post数据的方式), 核心代码如下
// 自定义转换器,将 Uint8List 转换为 List<int> 【关键, 取代utf8.decoder】 // 在 Dart 中,utf8.decoder 的确是一个 StreamTransformer,但它的类型是 StreamTransformer<List<int>, String>,而不是 StreamTransformer<Uint8List, String>。因此,直接使用 utf8.decoder 会导致类型不匹配的错误。 // 要解决这个问题,可以使用 StreamTransformer<Uint8List, String> 进行自定义转换,或者使用现有的转换器进行类型转换。 var transformer = StreamTransformer<Uint8List, String>.fromHandlers( handleData: (Uint8List data, EventSink<String> sink) { sink.add(utf8.decode(data)); }, );}
// 重新请求问答 Future<void> sendRegenerateQuest() async { cancelToken = CancelToken(); try { final response = await dio.value.post( 'http://192.168.31.115:8777/api/local_doc_qa/change_generate', data: { 'user_id':'zzp', 'generate': false }, options: Options(responseType: ResponseType.stream), // 数据接收模式,采用流模式 cancelToken: cancelToken ); // 流处理 response.data!.stream.transform(transformer).listen((String data) {
// 流开始接收处理 print('Revc RegenerateQuest Msg - data: $data'); }, onDone: () {
// 接收完成处理 print('RegenerateQuest······Done'); }, one rror: (error) {
// 异常报错处理 print('RegenerateQuest·······>onError'); }); } on DioException catch (error) {
// 网络异常处理 print('RegenerateQuest······POST Error: $error'); }finally {
//发送完成
}
上面就是简单的dio的处理的一个流程,其中transformer为
自定义转换器,将 Uint8List 转换为 List<int> 【关键, 取代utf8.decoder】 在 Dart 中,utf8.decoder 的确是一个 StreamTransformer,但它的类型是 StreamTransformer<List<int>, String>,而不是 StreamTransformer<Uint8List, String>。因此,直接使用 utf8.decoder 会导致类型不匹配的错误。 要解决这个问题,可以使用 StreamTransformer<Uint8List, String> 进行自定义转换,或者使用现有的转换器进行类型转换。 标签:dio,HTTP,utf8,StreamTransformer,decoder,数据流,data,flutter From: https://www.cnblogs.com/weijian168/p/18225610