Flutter升级后Utf8Decoder失效,APIPostRequest类类型匹配报错
解决Flutter升级后
HttpClientResponse.transform(utf8.decoder)的类型错误 这个问题是因为Flutter依赖的Dart版本更新后,utf8.decoder的类型定义发生了变化——它现在是Converter<List<int>, String>类型,而HttpClientResponse.transform()方法需要的参数是StreamTransformer<List<int>, String>,直接传入就会出现类型不匹配的错误。
下面给你两种解决方案,推荐第二种更简洁的写法:
方案一:用StreamTransformer.fromConverter包装转换器
如果你想保留原来的transform().join()写法,可以把utf8.decoder用StreamTransformer.fromConverter包装一下,让它符合参数类型要求:
修改这一行:
String reply = await response.transform(utf8.decoder).join();
为:
String reply = await response.transform(StreamTransformer.fromConverter(utf8.decoder)).join();
方案二:使用utf8.decodeStream(推荐)
Dart的utf8库提供了专门的decodeStream方法,可以直接把HttpClientResponse(本质是Stream<List<int>>)转换成字符串,代码更简洁,也不需要手动处理transform和join:
修改后的完整代码如下:
import 'dart:convert'; import 'dart:io'; class APIPostRequest { Future<String> apiRequest(String url, Map jsonMap) async { HttpClient httpClient = HttpClient(); try { HttpClientRequest request = await httpClient.postUrl(Uri.parse(url)); request.headers.set('Accept', 'application/json'); request.headers.set('Content-type', 'application/json'); request.headers.set('Authorization', "Bearer " + UserConstants.userAccessToken); request.add(utf8.encode(json.encode(jsonMap))); HttpClientResponse response = await request.close(); // 替换成decodeStream方法 String reply = await utf8.decodeStream(response); return reply; } finally { // 用try-finally确保httpClient一定会关闭,避免资源泄漏 httpClient.close(); } } }
另外我给代码加了try-finally块,不管请求过程中有没有异常,都会关闭httpClient,避免资源泄漏的问题,让代码更健壮。
内容的提问来源于stack exchange,提问作者blaze bnayak
相关产品推荐
相关产品推荐

