微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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...');
        },},);}}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。