Flutter底部导航栏无法传递Firebase当前用户邮箱求助
解决Firebase用户邮箱传递到底部导航栏的问题
问题分析
你当前的代码中,MyNavigationBar虽然通过构造函数接收了email参数,但初始化_widgetOptions时,给WelcomePage和ProfilePage传入的是硬编码的空字符串或"email",没有实际传递用户真实邮箱;同时Firebase Auth本身提供了直接获取当前登录用户信息的方法,可避免手动传递参数的繁琐。
解决方案
推荐两种可行方案,优先选择方案一:
方案一:直接从Firebase Auth获取当前用户邮箱(推荐)
无需在页面间手动传递邮箱,所有需展示邮箱的页面直接从Firebase Auth实例中获取用户信息,更可靠且减少冗余代码。
- 修改
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"), ), ); } }
- 同理修改
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"), ), ); } }
- 修改
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
相关产品推荐
相关产品推荐

