【问题标题】:utf8.decoder not working after latest Flutter Upgrade最新的 Flutter 升级后 utf8.decoder 不工作
【发布时间】:2025-11-24 18:05:01
【问题描述】:

类 APIPostRequest 工作正常,直到 Flutter 升级命中,它显示“参数类型 'Utf8Decoder' 无法分配给参数类型 'StreamTransformer'”的错误。同时使用 ...transform(utf8.decoder) 将 HttpClientResponse 的对象转换为 String ...

class APIPostRequest {
  Future<String> apiRequest(String url, Map jsonMap) async {
    HttpClient httpClient = new HttpClient();
    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();
    String reply = await response.transform(utf8.decoder).join();
    httpClient.close();
    return reply;
  }
}

【问题讨论】:

  • 我想如果你在stable频道上应该可以正常工作
  • 升级前它运行良好。尝试了这个解决方案*.com/questions/56862020/…,但它似乎正在改变其他一些字符串值中的预期响应
  • 我没有得到你。该解决方案对您不起作用吗?

标签: android http flutter dart


【解决方案1】:

corresponding breaking change announcement

错误案例(以及如何解决):

如果您在代码中看到以下错误,请按照以下方法进行修复:

  • 错误:“参数类型 'Utf8Decoder' 不能分配给参数类型 'StreamTransformer'。”
    • 如何解决:使用StreamTransformer.bind(Stream) 而不是Stream.transform(StreamTransformer)
    • 示例
      • 之前foo.transform(utf8.decoder)...
      • 之后utf8.decoder.bind(foo)...

【讨论】:

    【解决方案2】:

    评论String reply = await utf8.decoder.bind(response).join();

    并使用以下代码:

    //String reply = await response.transform(utf8.decoder).join();
    String reply;
    request.close().then((response){
    response.cast<List<int>>().transform(utf8.decoder).listen((content) {
        print (content);
        reply = content;
    });
    

    【讨论】:

      【解决方案3】:

      请看下面的解决方案

      class APIPostRequest {
          Future<String> apiRequest(String url, Map jsonMap) async {
              HttpClient httpClient = new HttpClient();
              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();
              String reply = await utf8.decoder.bind(response).join();
              httpClient.close();
              return reply;
          }
      }
      

      【讨论】: