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
相关产品推荐
相关产品推荐

