Ios 错误状态:流已被侦听到颤振错误
我正在调用一个api。发送请求后,我收到一个流式响应。但我无法解析响应并将其转换为String/JSON。这就是我调用api的地方Ios 错误状态:流已被侦听到颤振错误,ios,dart,flutter,Ios,Dart,Flutter,我正在调用一个api。发送请求后,我收到一个流式响应。但我无法解析响应并将其转换为String/JSON。这就是我调用api的地方 static Future<String> callDeviceListFetchApi() async { Completer completer = new Completer(); String jsonResponse; String url = Constants.BASE_URL + Constants.DEVICE_REGISTER_URL
static Future<String> callDeviceListFetchApi() async {
Completer completer = new Completer();
String jsonResponse;
String url = Constants.BASE_URL + Constants.DEVICE_REGISTER_URL;
var client = new http.Client();
var request = new http.Request('GET', Uri.parse(url));
request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
request.headers[HttpHeaders.AUTHORIZATION] = '<auth code>';
await client.send(request).then((response) {
response.stream.bytesToString().then((value) {
print(value.toString());
jsonResponse = value.toString();
completer.complete(jsonResponse);
});
}).catchError((error) {
print(error.toString());
});
return completer.future;
}
static Future callDeviceListFetchApi()异步{
Completer Completer=新的Completer();
字符串jsonResponse;
字符串url=Constants.BASE\u url+Constants.DEVICE\u REGISTER\u url;
var client=newhttp.client();
var request=newhttp.request('GET',Uri.parse(url));
request.headers[HttpHeaders.CONTENT_TYPE]=“application/json”;
request.headers[HttpHeaders.AUTHORIZATION]='';
等待客户端。发送(请求)。然后((响应){
response.stream.bytesToString().then((值){
打印(value.toString());
jsonResponse=value.toString();
completer.complete(jsonResponse);
});
}).catchError((错误){
打印(error.toString());
});
返回completer.future;
}
我得到了错误,
错误状态:已侦听流
颤振错误。你知道为什么会发生这种情况吗?你的代码有几个地方出了问题。我认为您对异步和未来在dart中的工作方式有一点误解-您应该重新阅读和本教程(和)
基本上,问题是您正在从异步函数返回一个“Future”。如果您从异步函数返回future,那么它就有问题(我不知道为什么分析器没有捕捉到这一点)
Future callDeviceListFetchApi()异步{
Completer Completer=新的Completer();
字符串url=“”;
var client=newhttp.client();
var request=newhttp.request('GET',Uri.parse(url));
request.headers[HttpHeaders.CONTENT_TYPE]=“application/json”;
request.headers[HttpHeaders.AUTHORIZATION]=
'';
var response=wait client.send(请求);
字符串jsonResponse;
试一试{
var value=wait response.stream.bytesToString();
打印(value.toString());
jsonResponse=value.toString();
}捕获(错误){
打印(error.toString());
}
返回completer.complete(jsonResponse);
}
或不异步:
Future<String> callDeviceListFetchApiNotAsync() {
String url = "<url>";
var client = new http.Client();
var request = new http.Request('GET', Uri.parse(url));
request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
request.headers[HttpHeaders.AUTHORIZATION] =
'<auth string>';
Completer completer = new Completer();
return client.send(request).then((response) {
return response.stream.bytesToString();
}).then((value) {
print(value.toString());
return value.toString();
}).catchError((error) {
print(error.toString());
// if you use catchError, whatever you return from it
// is the value you'll get wherever you resolve the future.
return null;
});
}
Future callDeviceListFetchApiNotAsync(){
字符串url=“”;
var client=newhttp.client();
var request=newhttp.request('GET',Uri.parse(url));
request.headers[HttpHeaders.CONTENT_TYPE]=“application/json”;
request.headers[HttpHeaders.AUTHORIZATION]=
'';
Completer Completer=新的Completer();
返回client.send(请求)。然后((响应){
返回response.stream.bytesToString();
}).然后((值){
打印(value.toString());
返回值.toString();
}).catchError((错误){
打印(error.toString());
//如果您使用catchError,则无论您从中返回什么
//无论你在哪里解决未来,你都会得到价值。
返回null;
});
}
但是,除非您试图执行我看不到的操作,否则有一种更简单的方法(假设您只想从服务器获取字符串):
Future getList()异步{
var response=wait http.get(“),头:{
HttpHeaders.CONTENT_类型:“application/json”,
HttpHeaders.AUTHORIZATION:“”,
});
如果(response.statusCode==200){
返回响应.body;
}否则{
抛出错误();
}
}
堆栈跟踪指向哪一行?该方法调用多次是否会导致此错误?我认为response.stream.bytesToString().then((值)
这是导致问题的原因。而且我只是在调试时才收到错误。否则运行应用程序不会显示任何错误。我有点困惑。调试器窗口中没有任何手表可能会干扰?顺便说一句,我不知道您在代码示例中使用的身份验证代码是否就是您实际使用的代码,但我很高兴建议不要将其发布在互联网上=D
Future<String> callDeviceListFetchApiNotAsync() {
String url = "<url>";
var client = new http.Client();
var request = new http.Request('GET', Uri.parse(url));
request.headers[HttpHeaders.CONTENT_TYPE] = 'application/json';
request.headers[HttpHeaders.AUTHORIZATION] =
'<auth string>';
Completer completer = new Completer();
return client.send(request).then((response) {
return response.stream.bytesToString();
}).then((value) {
print(value.toString());
return value.toString();
}).catchError((error) {
print(error.toString());
// if you use catchError, whatever you return from it
// is the value you'll get wherever you resolve the future.
return null;
});
}
Future<String> getList() async {
var response = await http.get("<url>", headers: {
HttpHeaders.CONTENT_TYPE: 'application/json',
HttpHeaders.AUTHORIZATION: '<auth string>',
});
if (response.statusCode == 200) {
return response.body;
} else {
throw Error();
}
}