Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 颤振:FormatException:解码长流响应时未终止的字符串_Json_Flutter_Dart_Server Sent Events - Fatal编程技术网

Json 颤振:FormatException:解码长流响应时未终止的字符串

Json 颤振:FormatException:解码长流响应时未终止的字符串,json,flutter,dart,server-sent-events,Json,Flutter,Dart,Server Sent Events,我正在制作一个颤振包。这用于使用服务器发送的事件。当返回的响应相对较小时,这种方法可以正常工作。但是,一旦响应变大,我就开始得到这个错误flatter:FormatException:Unterminated string 这是用于获取sse的代码段 while (true) { try { _client = http.Client(); var request = new http.Request("GET", Uri.

我正在制作一个颤振包。这用于使用服务器发送的事件。当返回的响应相对较小时,这种方法可以正常工作。但是,一旦响应变大,我就开始得到这个错误
flatter:FormatException:Unterminated string

这是用于获取sse的代码段

    while (true) {
      try {
        _client = http.Client();
        var request = new http.Request("GET", Uri.parse(url));
        request.headers["Cache-Control"] = "no-cache";
        request.headers["Accept"] = "text/event-stream";
        request.headers["Cookie"] = token;
        Future<http.StreamedResponse> response = _client.send(request);
        await for (final data in response.asStream()) {
          await for (final d in data.stream) {
            final rawData = utf8.decode(d);
            final event = rawData.split("\n")[1];
            if (event != null && event != '') {
              yield SSEModel.fromData(rawData);
            }
          }
        }
      } catch (e) {
        print('---ERROR---');
        print(e);
        yield SSEModel(data: '', id: '', event: '');
      }
      await Future.delayed(Duration(seconds: 1), () {});
    }
while(true){
试一试{
_client=http.client();
var request=newhttp.request(“GET”,Uri.parse(url));
请求头[“缓存控制”]=“无缓存”;
request.headers[“Accept”]=“文本/事件流”;
request.headers[“Cookie”]=令牌;
未来响应=_client.send(请求);
等待(response.asStream()中的最终数据){
等待(data.stream中的最终d){
最终rawData=utf8.解码(d);
最终事件=rawData.split(“\n”)[1];
如果(事件!=null&&event!=''){
产量模型。fromData(原始数据);
}
}
}
}捕获(e){
打印('---错误---');
印刷品(e);
生成SSEModel(数据:“”,id:“”,事件:“”);
}
等待未来。延迟(持续时间(秒:1),(){});
}

我的猜测是,响应的一部分由于大小过大而丢失。

因此,经过数小时的调试,我发现在我当前的方法中,当响应非常大时,部分响应被截断(不确定原因)。我把代码改成一行一行读,然后让它开始工作

data.stream
..变换(Utf8Decoder())
.transform(LineSplitter())
.listen((数据线){
//对此处的数据执行所需操作
}
这似乎解决了问题。
完整的代码可以在

中找到。您尝试过调试它吗?我建议:1.缩小异常的来源范围。您不应该放弃引发异常的堆栈跟踪。2.缩小异常发生的条件。对于特定长度的响应,是否总是发生异常?如果是,这是什么长度?您是否尝试过检查触发故障的响应?故障是否由处理响应中的单个块引起?(例如,是否保证在UTF-8码点边界上分割块?)