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
相关产品推荐
相关产品推荐

