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

Flutter GetX状态管理中RxBool类型loading状态不更新问题求助

问题成因
  • 响应式变量更新方式错误:你对loading变量直接重新赋值true.obs/false.obs,相当于替换了原有的RxBool实例,页面监听的仍是初始化时的旧实例,无法收到后续的状态变更通知。
  • 界面未添加响应式监听容器:GetX的响应式变量变更需要配合Obx/GetX这类监听组件才能触发界面重建,你直接在build方法中读取loading属性,状态变更不会触发界面刷新。
解决办法
  1. 修改控制器中loading变量的赋值逻辑,仅修改.value属性而非替换整个RxBool实例:
RxBool loading = false.obs;
List<String> texts = <String>[].obs;

getData() async {
  print('loading :' + loading.value.toString());
  // 仅修改value属性
  loading.value = true;    
  print('loading :' + loading.value.toString());

  var result = await http.get(Uri.parse(main_url));
  print(result.statusCode.toString());
  var data = json.decode(result.body);
  data.forEach((element) => texts.add(element["title"]));
  print(data);
  // 仅修改value属性
  loading.value = false;
  print('loading :' + loading.value.toString());
}
  1. 界面中用Obx包裹需要响应状态变化的组件,触发自动刷新:
class _HomePageState extends State<HomePage> {
  PostController controller = Get.put(PostController());
  @override
  void initState() {
    super.initState();
    controller.getData();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('App'),),
      // 用Obx包裹响应式区域
      body: Obx(() => controller.loading.isTrue
          ? Center(child: CircularProgressIndicator())
          : ListView.builder(
              itemBuilder: (context,index){
                return Card(child: ListTile(title: Text(controller.texts[index],style: TextStyle(color: Colors.black,fontSize: 24),)));
              },
              itemCount: controller.texts.length,
            )
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者x-DZ-Ax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:45:03