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

Flutter底部导航关联的个人页Firebase数据需手动刷新才加载如何解决

问题原因
  • 核心问题是异步获取Firestore数据完成后,没有调用setState()触发页面重建,Flutter感知不到loggedInUser的变化,所以UI不会自动更新,和底部导航没有直接关联。
  • 补充:如果你使用的是IndexedStack实现底部导航的页面保活,那么页面第一次加载后initState只会执行一次,后续切换到该页面不会重新触发数据拉取,不过这不是你当前首次进入不加载的直接原因。
修复方案
  1. 修改initState中的异步逻辑,数据赋值后调用setState通知UI刷新
  2. 新增加载状态判断,避免数据加载完成前展示空内容
  3. 强烈建议删除明文密码存储、展示逻辑,存在严重安全风险,Firebase Auth本身不会返回用户明文密码,云端存储明文密码属于高危操作

修改后的完整代码:

class _UserProfileState extends State<UserProfile> {
  User? user = FirebaseAuth.instance.currentUser;
  UserModel loggedInUser = UserModel();
  bool _isLoading = true; // 新增加载状态标记

  @override
  void initState() {
    super.initState();
    FirebaseFirestore.instance
        .collection("users")
        .doc(user!.uid)
        .get()
        .then((value) {
      // 赋值完成后调用setState触发UI重建
      setState(() {
        this.loggedInUser = UserModel.fromMap(value.data());
        _isLoading = false;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 加载阶段展示加载动画,加载完成后展示用户信息
      body: _isLoading 
        ? const Center(child: CircularProgressIndicator())
        : Stack(
          alignment: Alignment.center,
          children: [
            Column(
              children: [
                FadeAnimation(
                    1,
                    Container(
                      child: Column(
                        children: [
                          Row(
                            children: [
                              Padding(
                                padding: const EdgeInsets.only(left: 10),
                                child: Text("Name : ",
                                    style: TextStyle(
                                        fontSize: 18,
                                        color: Colors.black54,
                                        fontWeight: FontWeight.w500)),
                              ),
                              Padding(
                                padding: const EdgeInsets.fromLTRB(60, 0, 0, 0),
                                child: Text('${loggedInUser.fullName}',
                                    style: TextStyle(
                                        fontSize: 18,
                                        color: Colors.black54,
                                        fontWeight: FontWeight.w500)),
                              )
                            ],
                          ),
                          Row(
                            children: [
                              Padding(
                                padding: const EdgeInsets.only(left: 10),
                                child: Text("Email : ",
                                    style: TextStyle(
                                        fontSize: 18,
                                        color: Colors.black54,
                                        fontWeight: FontWeight.w500)),
                              ),
                              Padding(
                                padding: const EdgeInsets.fromLTRB(65, 0, 0, 0),
                                child: Text('${loggedInUser.email}',
                                    style: TextStyle(
                                        fontSize: 18,
                                        color: Colors.black54,
                                        fontWeight: FontWeight.w500)),
                              )
                            ],
                          ),
                        ],
                      ),
                    ))
              ],
            ),
          ],
        ),
    );
  }
}
可选优化(底部导航保活场景)

如果你需要每次切换到个人页都拉取最新数据,可以配合AutomaticKeepAliveClientMixin+VisibilityDetector,或者监听底部导航的切换回调,每次页面显示时重新触发数据请求即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:05