Flutter/Dart 如何将用户 uid 从 firebase 转换为变量?

问题描述

我试图从 Firebase 获取 uid 并将其放入一个变量中,以便在另一个类中使用它,但到目前为止我所做的最大值是将主页中的值显示为文本。当我尝试在主页中创建 final String riderId = snapshot.data.uid; 时,它会打印错误

getter 'uid' 被调用为 null。 接收器:空 尝试调用:uid

我已经在 youtube 上的 stackoverflow 和教程中看到了其他问题,但没有一个我有用!

我的主页:

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // print(riderId);
    return StreamBuilder(
      stream: AuthenticationService().authStateChanges,builder: (BuildContext context,AsyncSnapshot<User> snapshot) {
        // final String riderId = snapshot.data.uid;
        if (snapshot.hasData) {
          return Center(
            child: Text(snapshot.data.uid),);
        } else {
          return Text('Loading...');
        },},);}}

我的登录按钮

RaisedButton(
              onpressed: () {
                context.read<AuthenticationService>().signIn(
                      email: emailController.text.trim(),password: passwordController.text.trim(),);
              },child: Text("Sign in"),),

我的 main.dart

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        Provider<AuthenticationService>(
          create: (_) => AuthenticationService(),StreamProvider(
          create: (context) =>
              context.read<AuthenticationService>().authStateChanges,)
      ],child: MaterialApp(...

我的身份验证服务页面

class AuthenticationService {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  Stream<User> get authStateChanges => _firebaseAuth.idTokenChanges();

  
  Future<usermodel> signIn({String email,String password}) async {
   
      var result = await _firebaseAuth.signInWithEmailAndPassword(
          email: email,password: password);
      return usermodel(result.user.uid);
    } 
  }

解决方法

尝试使用 authStateChanges()

 Stream<User> get authStateChanges => FirebaseAuth.instance.authStateChanges();

Stream<User> get authStateChanges => FirebaseAuth.instance.userChanges();
,

流可以发出 null 作为第一个事件。因此,您应该始终在执行 uid 检查或检查是否 null:

后访问 snapshot.hasData
  
  @override
  Widget build(BuildContext context) {
    // print(riderId);
    return StreamBuilder(
      stream: AuthenticationService().authStateChanges,builder: (BuildContext context,AsyncSnapshot<User> snapshot) {
        // final String riderId = snapshot.data.uid; // <~~ you'll always get an error in the first event if it's null
        if (snapshot.hasData) {
          final String riderId = snapshot.data.uid; // <~~ here should be fine
          return Center(
            child: Text(snapshot.data.uid),);
        } else {
          return Text('Loading...');
        },},);}}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...