Flutter中如何将登录获取的邮箱传递给CustomerInfo类调用getCustomerData
问题根源
- 你在LoginScreen中创建的
CustomerInfo(email: email)是局部临时实例,没有传递给CustomerScreen,跳转完成后就被系统回收 - CustomerScreen中
CustomerInfo customerInfo = CustomerInfo();是新创建的空实例,没有传入邮箱参数,所以调用getCustomerData()时email属性为null,自然查不到数据
解决方案1:参数透传(手动传邮箱)
步骤1:给CustomerScreen添加接收邮箱的构造参数
修改CustomerScreen的Widget定义:
class CustomerScreen extends StatefulWidget { // 新增邮箱接收参数 final String? email; const CustomerScreen({Key? key, this.email}) : super(key: key); @override _CustomerScreenState createState() => _CustomerScreenState(); }
步骤2:修改LoginScreen跳转逻辑,传递邮箱
删掉无用的临时CustomerInfo实例,跳转时把邮箱传给CustomerScreen:
if (user != null) { Navigator.push( context, MaterialPageRoute( builder: (context) => CustomerScreen(email: email))); }
步骤3:修改CustomerScreen的getData方法,传邮箱给CustomerInfo
获取数据后记得调用setState更新页面UI:
void getData() async { // 把页面拿到的邮箱传给CustomerInfo CustomerInfo customerInfo = CustomerInfo(email: widget.email); await customerInfo.getCustomerData(); setState(() { name = customerInfo.name; surname = customerInfo.surname; balance = customerInfo.balance; image = customerInfo.avatarLink; }); print("Name: $name"); }
解决方案2:直接取Firebase全局登录信息(无需跨页传参)
登录成功后FirebaseAuth会全局保存当前用户的信息,不需要手动跨页传递邮箱,更稳妥:
直接修改CustomerScreen的getData方法即可:
void getData() async { // 直接从FirebaseAuth获取当前登录用户的邮箱 String? loginEmail = FirebaseAuth.instance.currentUser?.email; CustomerInfo customerInfo = CustomerInfo(email: loginEmail); await customerInfo.getCustomerData(); setState(() { name = customerInfo.name; surname = customerInfo.surname; balance = customerInfo.balance; image = customerInfo.avatarLink; }); }
内容的提问来源于stack exchange,提问作者themmfa
相关产品推荐
相关产品推荐

