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

Flutter GetX Builder监听到变量更新但UI未刷新问题求助

问题根因

你代码的核心问题是控制器实例不匹配:

  • 你在GetBuilder的init参数中初始化了第一个AuthController实例,这个实例是和当前GetBuilder绑定、用来触发UI更新的实例
  • 但你在initState回调中重新创建了第二个全新的AuthController实例,调用的是第二个实例的fetchUserData方法,修改的也是第二个实例的isLoading值,和GetBuilder绑定的第一个实例完全无关,自然不会触发UI更新
修复方案

直接使用initState回调参数自带的绑定好的控制器实例即可,不需要自己新建实例,修改后ProfileCard代码如下:

class ProfileCard extends StatelessWidget {
  const ProfileCard({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetBuilder<AuthController>(
      init: AuthController(),
      // 直接使用回调参数state中的controller,就是上方init出来的绑定实例
      initState: (state) => state.controller?.fetchUserData(),
      builder: (controller) {
        if (controller.isLoading.value) {
          return const Center(child: CircularProgressIndicator());
        }
        // 你的业务内容代码
        return Container();
      },
    );
  }
}
补充优化建议

你当前的fetchUserData逻辑存在边界问题:如果_auth.currentUser为空(用户未登录),你不会调用setLoading修改加载状态,会一直显示加载指示器,建议补充else分支处理:

fetchUserData() async {
  setLoading(true);
  _firebaseUser.bindStream(_auth.authStateChanges());
  if (_auth.currentUser != null) {
    bool profileRetrieved =
        await FirestoreDB().getUserProfile(_auth.currentUser!.uid).then((_) {
      return true;
    });
    setLoading(!profileRetrieved);
  } else {
    // 未登录场景也关闭加载状态
    setLoading(false);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:36:04