You need to enable JavaScript to run this app. Flutter使用GetX管理状态时Widget不随状态更新刷新如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用GetX管理状态时Widget不随状态更新刷新如何解决?

问题原因&修复方案

核心问题共有3处:

  • 没有用Obx包裹需要响应状态变化的Text组件,GetX只有被Obx包裹的组件才会监听响应式变量的变化自动刷新UI
  • 修改响应式变量的值时没有访问.value属性,代码中直接把RxBool类型的item赋值成了bool类型的true,相当于直接覆盖了响应式变量本身,而不是修改它存储的状态值
  • Get.put逻辑放在了build方法中,build会随页面重建多次执行,属于不规范的初始化写法
  • 响应式变量类型定义不规范,不需要用dynamic,直接声明为RxBool即可

修正后完整代码:

import 'package:flutter/material.dart';
import 'package:get/get.dart';

void main() {
  runApp(GetMaterialApp(home : Home()));
}

class BoolItem extends GetxController{
  // 规范声明响应式变量类型
  RxBool item = false.obs;
  // 修改时访问.value属性赋值
  changeItem()=> item.value = true;
}


class Home extends StatefulWidget {
  const Home({ Key? key }) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  // 提前声明控制器
  late final BoolItem b;

  @override
  void initState() {
    super.initState();
    // 初始化放到initState中,避免build重复执行
    b = Get.put(BoolItem());
  }

  @override
  Widget build(context) {
    return Scaffold(
      appBar: AppBar(title: Text('welcome')),
      body: Center(
        child: Column(children: <Widget>[
          FloatingActionButton(
            child: Icon(Icons.add), 
            onPressed: (){
              b.changeItem();
            }
          ),
          // 用Obx包裹需要响应变化的组件
          Obx(() => b.item.value ? Text('true') : Text('false'))
        ]
    ))        
    );
  }
}

内容的提问来源于stack exchange,提问作者sojinLee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 21:51:03