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

Flutter底部导航栏无法传递Firebase当前用户邮箱求助

解决Firebase用户邮箱传递到底部导航栏的问题

问题分析

你当前的代码中,MyNavigationBar虽然通过构造函数接收了email参数,但初始化_widgetOptions时,给WelcomePage和ProfilePage传入的是硬编码的空字符串或"email",没有实际传递用户真实邮箱;同时Firebase Auth本身提供了直接获取当前登录用户信息的方法,可避免手动传递参数的繁琐。

解决方案

推荐两种可行方案,优先选择方案一:


方案一:直接从Firebase Auth获取当前用户邮箱(推荐)

无需在页面间手动传递邮箱,所有需展示邮箱的页面直接从Firebase Auth实例中获取用户信息,更可靠且减少冗余代码。

  1. 修改WelcomePage,去掉构造函数的email参数,直接获取用户邮箱:
class WelcomePage extends StatelessWidget {
  const WelcomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final currentUser = FirebaseAuth.instance.currentUser;
    final userEmail = currentUser?.email ?? "未登录"; // 处理未登录情况
    return Scaffold(
      // 你的页面布局,示例展示邮箱
      body: Center(
        child: Text("欢迎回来,$userEmail"),
      ),
    );
  }
}
  1. 同理修改ProfilePage,去掉email参数,直接获取用户邮箱:
class ProfilePage extends StatelessWidget {
  const ProfilePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final currentUser = FirebaseAuth.instance.currentUser;
    final userEmail = currentUser?.email ?? "未登录";
    return Scaffold(
      body: Center(
        child: Text("当前用户邮箱:$userEmail"),
      ),
    );
  }
}
  1. 修改MyNavigationBar,不再需要接收email参数:
class MyNavigationBar extends StatefulWidget {
  const MyNavigationBar({Key? key}) : super(key: key);

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

class _MyNavigationBarState extends State<MyNavigationBar> {
  int _selectedIndex = 0;

  final List<Widget> _widgetOptions = const <Widget>[
    WelcomePage(),
    BMICalculator(),
    BMICalculator(),
    ProfilePage()
  ];

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: _widgetOptions[_selectedIndex],
        bottomNavigationBar: CustomNavigationBar(
          isFloating: true,
          elevation: 2,
          iconSize: 30,
          selectedColor: Colors.blueAccent,
          items: const [
            CustomNavigationBarItem(icon: Icon(Icons.home_outlined)),
            CustomNavigationBarItem(icon: Icon(Icons.location_on_outlined)),
            CustomNavigationBarItem(icon: Icon(Icons.medical_services_outlined)),
            CustomNavigationBarItem(icon: Icon(Icons.settings))
          ],
          onTap: (i) {
            setState(() {
              _selectedIndex = i;
            });
          },
          currentIndex: _selectedIndex,
        ),
      ),
    );
  }
}

方案二:正确传递widget.email参数到页面

如果坚持通过参数传递邮箱,需修改_widgetOptions的初始化方式,确保每次都使用最新的widget.email:

class _MyNavigationBarState extends State<MyNavigationBar> {
  int _selectedIndex = 0;

  // 使用getter方法,确保每次获取_widgetOptions时都使用最新的widget.email
  List<Widget> get _widgetOptions => <Widget>[
        WelcomePage(email: widget.email ?? ""),
        const BMICalculator(),
        const BMICalculator(),
        ProfilePage(email: widget.email ?? "")
      ];

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: _widgetOptions[_selectedIndex],
        // 底部导航栏代码保持不变
        bottomNavigationBar: CustomNavigationBar(
          isFloating: true,
          elevation: 2,
          iconSize: 30,
          selectedColor: Colors.blueAccent,
          items: const [
            CustomNavigationBarItem(icon: Icon(Icons.home_outlined)),
            CustomNavigationBarItem(icon: Icon(Icons.location_on_outlined)),
            CustomNavigationBarItem(icon: Icon(Icons.medical_services_outlined)),
            CustomNavigationBarItem(icon: Icon(Icons.settings))
          ],
          onTap: (i) {
            setState(() {
              _selectedIndex = i;
            });
          },
          currentIndex: _selectedIndex,
        ),
      ),
    );
  }
}

原代码的问题在于_widgetOptions是在State类初始化时创建的,此时widget.email可能尚未传递或更新,导致页面拿到的是硬编码值;改用getter后,每次build时都会重新生成页面实例,传入最新的widget.email。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:05:20