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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:15:04