Flutter 从未来中提取价值

Flutter 从未来中提取价值,flutter,dart,Flutter,Dart,我想从api调用中提取响应的值 import 'package:http/http.dart' as http; refreshToken() { Future<http.Response> _response = _httpClient.callApi( endPoint: refreshTokenEndpoint, variables: refreshTokenVariables); http.Response _tokenResponse;

我想从api调用中提取响应的值

  import 'package:http/http.dart' as http;

  refreshToken() {
  Future<http.Response> _response = _httpClient.callApi(
      endPoint: refreshTokenEndpoint, variables: refreshTokenVariables);

  http.Response _tokenResponse;
  _response.then((http.Response value) => _tokenResponse = value);

  print(_tokenResponse.body);
  }
import'package:http/http.dart'作为http;
刷新令牌(){
未来响应=\u httpClient.callApi(
端点:refreshTokenEndpoint,变量:refreshTokenVariables);
http.Response\u tokenResponse;
_然后((http.response value)=>\u tokenResponse=value);
打印(_tokenResponse.body);
}

但是当我尝试访问主体时,我得到一个错误主体被调用为null。

您需要等待
\u tokenResponse
,因为它来自未来

refreshTokenSolution() async {
    Future<bool> _response = Future.delayed(Duration(seconds: 2), () => true);
    bool _tokenResponse = await _response; // Wait this response and after go next line
    print(_tokenResponse); //TRUE
  }
refreshTokenSolution()异步{
Future _response=Future.delayed(持续时间(秒:2),()=>true);
bool _tokenResponse=Wait _response;//等待此响应,然后转到下一行
print(_tokenResponse);//TRUE
}

您需要在方法中使用async/await来获取值

您可以执行以下操作

Future refreshtToken()异步{
final http.Response\u Response=await\u httpClient.callApi(
端点:刷新令牌端点,
变量:刷新标记变量,
);
打印(_response.body);
}
你的电话不起作用的原因是你没有在等电话。您的想法是正确的,只需在代码中指定
\u httpClient.callApi
返回值需要一些时间。当您这样做时,您的代码将异步运行,而不是同步运行。你可以读更多

当您运行代码时,这就是正在发生的事情

void main()异步{
var str='这将首先运行';
//立即执行
打印(str);
//立即执行
//这将在打印前等待一秒钟
未来。延迟(持续时间(秒:1))。然后((){
str='等待1秒后将打印第三个';
打印(str);
});
//立即执行
//由于[Future]尚未完成,此打印语句将第二次打印
//完成了1秒的等待
str='这将是第二次打印';
打印(str);
}
一切都是立即执行的,但因为我们有第二个延迟,它的函数在未来等待1秒后不会执行


因此,我们可以看到,您正在使用请求的响应分配
\u tokenResponse
,但因为您没有等待结果,所以代码会继续运行,而您的值会被忽略。

有一种称为事件循环的东西,每次我们调用没有
等待的未来时,我们都不会运行代码,但也要安排一个事件在
将来取消解析

import'package:http/http.dart'作为http;
刷新令牌(){
//这里http正在调度,但它没有答案。
//该答案或结果将在将来提供
未来响应=\u httpClient.callApi(
端点:refreshTokenEndpoint,变量:refreshTokenVariables);
//在这里,您要声明一个具有空值的_tokenResponse变量。
http.Response\u tokenResponse;
//在这里,您指定了_响应在将来产生结果的时间
//_tokenResponse将有一个赋值(但在将来,
//不在现在)
_然后((http.response value)=>\u tokenResponse=value);
//\u令牌响应继续为空,因为\u响应将
//将在将来解决。接下来,\u tokenResponse.body是相同的
//调用null.body
打印(_tokenResponse.body);
}

_tokenResponse继续为null,因为_响应将在将来解析。接下来,
\u tokenResponse.body
是同一个调用
null.body
,这会生成一个错误。

您必须在中写入打印语句,然后阻塞或使用异步等待,这是否回答了您的问题?