You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter相同代码调用其他API正常,调用特定API时应用冻结

问题分析与修复方案

核心问题排查

1. 请求URL错误

你的getQuoteAPI方法中调用的是APPURL.quoteBaseURL(即https://dummyjson.com),这是网站根地址,返回的是HTML页面而非JSON接口。正确的名言接口应该是https://dummyjson.com/quotes,并且需要带上limit和skip参数。

2. HTTP请求未设置超时

默认的http.get没有超时限制,当请求因URL错误出现异常(如服务器响应缓慢、重定向异常)时,Future会一直处于等待状态,若直接在UI线程调用,会导致应用冻结。

3. 不必要的异步等待

returnJson方法没有异步操作,却使用了await,会额外增加异步开销,虽然不是冻结的直接原因,但会影响代码效率。


修复步骤

步骤1:修正请求URL

更新getQuoteAPI方法,使用正确的接口地址并拼接参数:

Future<dynamic> getQuoteAPI(int limit, int skip) async {
  try {
    // 拼接正确的接口URL,带上limit和skip参数
    String targetUrl = "${APPURL.quoteBaseURL}/quotes?limit=$limit&skip=$skip";
    final data = await _networkApi.GETRequest(targetUrl);
    print("data");
    print(data.toString());
    return data;
  } catch (e) {
    rethrow;
  }
}

同时建议将APPURL中的quoteEndPointURL改为静态变量,方便直接调用:

class APPURL {
  static String baseURL = 'https://api.quotable.io/';
  static String quoteURL = '${baseURL}quotes?limit=10';
  static String quoteBaseURL = "https://dummyjson.com";
  // 改为静态变量
  static String quoteEndPointURL = "$quoteBaseURL/quotes?";
}

之后也可以用"${APPURL.quoteEndPointURL}limit=$limit&skip=$skip"拼接地址。

步骤2:添加请求超时限制

修改GETRequest方法,给http.get设置超时时间(比如10秒),避免请求无限挂起:

Future<dynamic> GETRequest(String url) async {
  dynamic responseData;
  try {
    Uri uri = Uri.parse(url);
    // 设置10秒超时,超时后自动抛出TimeoutException
    http.Response response = await http.get(uri).timeout(const Duration(seconds: 10));
    // 去掉不必要的await,returnJson无异步操作
    responseData = returnJson(response);
    print("response data$responseData");
  } on SocketException {
    throw FetchDataException("No internet connection");
  } on TimeoutException {
    throw FetchDataException("Timeout for network connection");
  } catch (e) {
    print("catch");
    print(e.toString());
    throw FetchDataException("Error during API call: $e");
  }
  return responseData;
}

步骤3:确保UI线程不被阻塞

调用getQuoteAPI时,不要在UI线程同步执行,建议在initState中通过异步函数调用,或使用FutureBuilder处理:

@override
void initState() {
  super.initState();
  _loadQuotes();
}

// 异步加载数据,避免阻塞UI
void _loadQuotes() async {
  try {
    var quoteData = await getQuoteAPI(10, 0);
    // 处理返回的名言数据
  } catch (error) {
    // 处理错误,比如提示用户
  }
}

内容的提问来源于stack exchange,提问作者Jeevan Shrestha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:31:24