Flutter按钮点击执行双函数问题求助:fetchBalance响应体正常打印但状态码判断逻辑未执行
嘿,我来帮你排查这个fetchBalance函数的问题!根据你描述的情况——能打印响应体但200状态码的分支没执行,还没报错,大概率是这几个原因导致的,咱们一步步来解决:
第一步:先搞清楚状态码到底是多少
你现在只打印了响应体,但没确认实际的HTTP状态码。很多时候API可能返回看起来正常的响应体,但状态码并不是200(比如201创建成功、304缓存、400参数错误等等)。所以先给fetchBalance加几行日志:
Future<Balance> fetchBalance() async { final fullUrl = '$url1$url2'; print('当前请求的URL: $fullUrl'); // 确认请求地址是否正确 final response = await http.get(Uri.parse(fullUrl)); print('响应状态码: ${response.statusCode}'); // 关键!打印状态码 print('响应体: ${response.body}'); if (response.statusCode == 200) { print('进入200状态码分支'); // 确认是否走到这里 return Balance.fromJson(jsonDecode(response.body)); } else { print('状态码不符合,抛出异常: ${response.statusCode}'); throw Exception('Failed to load balance, status code: ${response.statusCode}'); } }
运行后看控制台的日志,就能明确是状态码不对,还是代码逻辑有问题。
第二步:确认url2是否真的更新了
按钮点击时你先调用了doSomething()更新url2,但有可能doSomething的实现有问题,导致url2还是旧值。比如你可以在按钮点击时加个打印:
onPressed:() async{ doSomething(); print('调用fetchBalance前的url2: $url2'); // 看看是不是TextField的输入值 try { await fetchBalance(); } catch (e) { print('fetchBalance出错了: $e'); // 捕获异常,避免静默失败 } }
如果这里打印的url2还是默认的noAddress entered,那说明doSomething里的setState逻辑有问题,检查一下doSomething的实现是不是像下面这样:
void doSomething() { setState(() { url2 = _addressControler.text; }); }
要是没问题的话,这里的url2应该能同步更新为输入的内容。
第三步:修复FutureBuilder的更新逻辑(如果需要更新UI的话)
你提到页面里有FutureBuilder展示余额,但你在按钮点击时只是调用了await fetchBalance(),并没有把新的Future赋值给futureBalance变量。这样原来的FutureBuilder还是监听initState里初始化的那个旧Future,不会更新UI。如果你的需求是点击按钮后刷新余额展示,应该改成这样:
onPressed:() async{ doSomething(); setState(() { futureBalance = fetchBalance(); // 重新赋值,让FutureBuilder监听新请求 }); }
最后补充个小细节
记得在页面dispose的时候释放TextEditingController,避免内存泄漏:
@override void dispose() { _addressControler.dispose(); super.dispose(); }
先按上面的步骤加日志排查,应该很快就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者VARADHARAJ MAHENDRAN

