如何获取当前的 Firebase UID 并将其写入实时数据库?

How do I get the current Firebase UID and write it to Realtime Database?

我按照教程创建了这个 AuthService class。这很好用。

import 'package:firebase_auth/firebase_auth.dart';
import 'package:app/models/user.dart' as UserModel;

class AuthService {

  final FirebaseAuth _auth = FirebaseAuth.instance;

  // create CurrentUser object based on Firebase user object
  UserModel.User? _userFromFirebaseUser(User? user) {
    // return user != null ? UserModel.User(uid: user.uid) : null;
    if (user != null) {
      return UserModel.User(uid: user.uid);
    } else {
      return null;
    }
  }

  //auth change user stream
  Stream<UserModel.User?> get user {
    return _auth.authStateChanges()
        // .map((User? user) => _userFromFirebaseUser(user));
      .map(_userFromFirebaseUser);
  }

  //Sign in anonymously
  Future signInAnon() async {
    try {
      UserCredential result = await _auth.signInAnonymously();
      User? user = result.user;
      return _userFromFirebaseUser(user);
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

  //Sign in with email and pass
  Future signInWithEmailAndPassword(String email, String password) async {
    try {
      UserCredential result = await _auth.signInWithEmailAndPassword(email: email, password: password);
      User? user = result.user;
      return _userFromFirebaseUser(user);
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

  //register with email and password
  Future registerWithEmailAndPassword(String email, String password) async {
    try {
      UserCredential result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
      User? user = result.user;
      return _userFromFirebaseUser(user);
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

  //sign out
  Future signOut() async {
    try {
      return await _auth.signOut();
    } catch(e) {
      print(e.toString());
      return null;
    }
  }

}

但是,我现在想在用户在聊天屏幕上发送聊天时使用当前的 Firebase UID 将其写入实时数据库。我该怎么做?我在下面尝试过,但迷路了(请参阅 FloatingActionButton 的 OnPressed 事件)。

import 'package:firebase_database/firebase_database.dart';
import 'package:flutter/material.dart';
import 'package:app/services/auth.dart';
import 'package:app/models/user.dart';

class Chat extends StatelessWidget { 
  Chat({Key? key}) : super(key: key);
  final database = FirebaseDatabase.instance.reference();

  @override
  Widget build(BuildContext context) {
    final groupChatRef = database.child('GroupID');

    return Scaffold(
      appBar: AppBar(
        title: Text('Group Chat Screen'),
        // actions: [
        //   TextButton.icon(
        //       onPressed: {
        //         Navigator.pop(context);
        //       },
        //       icon: icon,
        //       label: label
        //   )
        // ],
      ),
      body: Align(
        alignment: Alignment.bottomLeft,
        child: Row(
          children: [
            Expanded(
              child: TextField(
                  decoration: InputDecoration(
                    hintText: "Write message...",
                  )
              ),
            ),
            FloatingActionButton(
              onPressed: () {
                var uid;
                final user = User(uid: uid);
                final myAuth = AuthService();
                print('MyAuth.user:');
                //This is where I get lost...
              },
              child: Icon(Icons.send,color: Colors.white,size: 18,),
              backgroundColor: Colors.blue,
              elevation: 0,
            )
          ],
        ),
      )
    );
  }
}

在auth服务

中添加getter即可获取用户uid
class AuthService {
  ...
  User? get currentUser => _auth.currentUser;
  ...

然后在您的浮动操作按钮中获取此用户并使用它的 uid

此外,最好使用依赖注入并在每次需要时停止创建实例。

              onPressed: () {
                final String uid = authService.currentUser!.uid;
                // do other things
              },