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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:54:03