Flutter使用GetX时如何点击按钮触发控制器重新请求刷新数据
GetX点击刷新随机数据解决方案
核心原因
你之前尝试的三种方案都没有触发新的网络请求,无法获取新的随机笑话数据:
jokeController.joke.refresh()仅能强制触发响应式变量的监听回调,本身不会发起新的网络请求setState((){})是StatefulWidget的局部刷新API,你当前使用Obx监听响应式变量的场景完全不需要调用该方法Get.to(JokePage())仅会新打开一个详情页,原页面的控制器不会重新执行onInit生命周期里的请求逻辑
正确实现方法
1. 按钮点击触发请求
直接在按钮的onPressed回调中调用控制器里封装好的fetchJoke方法即可,还可以加个加载状态判断避免用户快速点击重复发起请求:
onPressed: () { // 非加载状态下才允许发起新请求 if (!jokeController.isLoading.value) { jokeController.fetchJoke(); } },
因为你代码中是直接给joke.value赋值全新的Joke对象,Obx可以正常监听到变量变化,自动刷新页面文本,不需要额外调用refresh方法。
2. 排查隐藏问题(如果调用方法后还是返回相同数据)
你当前贴出的getJoke请求方法中,没有把传入的chosenCategory分类参数拼接到请求URL中,也没有处理GET请求缓存的问题,可能导致每次请求拿到的都是相同数据:
static Future<Joke> getJoke(String chosenCategory) async { try { // 拼接分类参数,同时加时间戳参数规避GET请求缓存 var finalUrl = "$url?category=$chosenCategory&t=${DateTime.now().millisecondsSinceEpoch}"; var response = await client.get(Uri.parse(finalUrl)).timeout(Duration(seconds: 10)); if (response.statusCode == 200) { Joke _joke = new Joke(); var responseBody = response.body; return _joke.jokeFromJson(responseBody); } } catch (error) { return null; } }
可以加断点调试确认每次请求返回的响应内容是否不同,以及jokeFromJson解析逻辑是否正确。
内容的提问来源于stack exchange,提问作者aoiTenshi
相关产品推荐
相关产品推荐

