Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Flatter中从Firebase获取当前用户id_Firebase_Dart_Firebase Authentication_Flutter - Fatal编程技术网

如何在Flatter中从Firebase获取当前用户id

如何在Flatter中从Firebase获取当前用户id,firebase,dart,firebase-authentication,flutter,Firebase,Dart,Firebase Authentication,Flutter,我正在尝试这个- final Future<FirebaseUser> user = auth.currentUser(); final Future user=auth.currentUser(); 但问题是,不是通过“用户ID”生成文档,而是通过以下名称生成文档: Instance of 'Future<FirebaseUser>' “未来”的实例 这是我现在的文档名,但我想让它成为用户ID 我该怎么办?更新(2020.09.09) firebase_认证版本

我正在尝试这个-

final Future<FirebaseUser> user = auth.currentUser();
final Future user=auth.currentUser();
但问题是,不是通过“用户ID”生成文档,而是通过以下名称生成文档:

Instance of 'Future<FirebaseUser>'
“未来”的实例 这是我现在的文档名,但我想让它成为用户ID

我该怎么办?

更新(2020.09.09)

firebase_认证版本0.18.0之后

firebase_auth 0.18.0中进行了一些突破性的更新。FirebaseUser现在称为User,currentUser是getter,currentUser是同步的

这使得获取uid的代码如下所示:

final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() {
    final User user = auth.currentUser;
    final uid = user.uid;
    // here you write the codes to input the data into firestore
  }
final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() async {
    final FirebaseUser user = await auth.currentUser();
    final uid = user.uid;
    // here you write the codes to input the data into firestore
  }
firebase_认证版本0.18.0之前

uid是FirebaseUser对象的属性。由于auth.currentUser()返回一个future,因此必须等待以获得如下所示的用户对象:

final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() {
    final User user = auth.currentUser;
    final uid = user.uid;
    // here you write the codes to input the data into firestore
  }
final FirebaseAuth auth = FirebaseAuth.instance;

void inputData() async {
    final FirebaseUser user = await auth.currentUser();
    final uid = user.uid;
    // here you write the codes to input the data into firestore
  }

如果您使用谷歌登录,您将获得此用户信息

final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();
void initState(){
super.initState();
 firebaseAuth.onAuthStateChanged
        .firstWhere((user) => user != null)
        .then((user) {
      String user_Name = user.displayName;
      String image_Url = user.photoUrl;
      String email_Id = user.email;
      String user_Uuid = user.uid; // etc
      }
       // Give the navigation animations, etc, some time to finish
    new Future.delayed(new Duration(seconds: 2))
        .then((_) => signInWithGoogle());
        }

     Future<FirebaseUser> signInWithGoogle() async {
  // Attempt to get the currently authenticated user
  GoogleSignInAccount currentUser = _googleSignIn.currentUser;
  if (currentUser == null) {
    // Attempt to sign in without user interaction
    currentUser = await _googleSignIn.signInSilently();
  }
  if (currentUser == null) {
    // Force the user to interactively sign in
    currentUser = await _googleSignIn.signIn();
  }

  final GoogleSignInAuthentication googleAuth =
      await currentUser.authentication;

  // Authenticate with firebase
  final FirebaseUser user = await firebaseAuth.signInWithGoogle(
    idToken: googleAuth.idToken,
    accessToken: googleAuth.accessToken,
  );

  assert(user != null);
  assert(!user.isAnonymous);

  return user;
}
final FirebaseAuth FirebaseAuth=FirebaseAuth.instance;
最终GoogleSignIn_GoogleSignIn=新GoogleSignIn();
void initState(){
super.initState();
firebaseAuth.onAuthStateChanged
.firstWhere((用户)=>user!=null)
.然后((用户){
字符串user\u Name=user.displayName;
字符串image_Url=user.photoUrl;
字符串email_Id=user.email;
字符串user\u Uuid=user.uid;//等
}
//给导航动画等一些时间来完成
新的未来。延迟(新的持续时间(秒:2))
。然后(()=>使用谷歌()登录);
}
未来登录使用Google()异步{
//尝试获取当前经过身份验证的用户
GoogleSignInAccount currentUser=\u googleSignIn.currentUser;
if(currentUser==null){
//尝试在没有用户交互的情况下登录
currentUser=Wait_googleSignIn.signizely();
}
if(currentUser==null){
//强制用户以交互方式登录
currentUser=Wait_googleSignIn.signIn();
}
最终谷歌签名认证=
等待currentUser.authentication;
//通过firebase验证
final FirebaseUser user=等待firebaseAuth.signiWithGoogle(
idToken:googleAuth.idToken,
accessToken:googleAuth.accessToken,
);
断言(用户!=null);
断言(!user.isAnonymous);
返回用户;
}

您需要等待异步操作完成

final FirebaseUser user = await auth.currentUser();
final userid = user.uid;
也可以使用then样式语法:

final FirebaseUser user = auth.currentUser().then((FirebaseUser user) {
  final userid = user.uid;
  // rest of the code|  do stuff
});

这是另一种解决方法:

Future<String> inputData() async {
    final FirebaseUser user = await FirebaseAuth.instance.currentUser();
    final String uid = user.uid.toString();
  return uid;
  }
Future inputData()异步{
final FirebaseUser user=等待FirebaseAuth.instance.currentUser();
最后一个字符串uid=user.uid.toString();
返回uid;
}
它以字符串形式返回
uid

final FirebaseAuth _auth = FirebaseAuth.instance;
getCurrentUser() async {
    final FirebaseUser user = await _auth.currentUser();
    final uid = user.uid;
    // Similarly we can get email as well
    //final uemail = user.email;
    print(uid);
    //print(uemail);
  }
调用函数getCurrentUser以获取结果。例如,我使用了一个按钮:

RaisedButton(
              onPressed: getCurrentUser,
              child: Text('Details'),
            ),

正常地做这件事总会有回报

Instance of 'Future<FirebaseUser>'
这是获取ID最方便的方法 你也可以像这样获得电子邮件和手机号码。

你也可以试试这个

     currentUser() {
         final User user = _firebaseAuth.currentUser;
         final uid = user.uid.toString();
         return uid;
      }
现在只需在代码中调用
currentUser()
,它将返回当前登录用户的uid

    uid=FirebaseAuthService().currentUser();

您可以在颤振小部件之前将其添加到全局状态

final FirebaseAuth auth = FirebaseAuth.instance;
final User user = auth.currentUser;
final myUid = user.uid;

它将使myUid在这种情况下可用。

你知道你应该如何在dart中使用Futures吗?好的,如果你想用Flatter编写应用程序,这是你必须学习的。这是你如何进行异步编程。如果你不懂,你不会走得很远。但至少告诉我此问题的解决方案…您需要“等待”将来在异步工作完成时获得它将包含的FirebaseUser对象。该FirebaseUser对象将具有用户UID的属性。您可能应该查阅Firebase Auth API文档了解更多详细信息。您可能还需要阅读此处了解rn关于Dart中的异步编程。没有这些知识,你不会走得很远:除非我弄错了,否则它仍然会返回一个未来,不是吗?即使它是字符串类型的?你仍然需要在另一端处理它。这不起作用。我只是用我的代码尝试了它,它给出了相同的未来实例。你是第一次创建u吗serID a全局变量?…您只能通过使用.then()来实现这一点。谢谢!天哪!Flatter是新手,而且过时的教程太混乱了。@martin我听到了。FlatterFire插件中的突破性更改相对较新,因此更新过时的文档可能需要一段时间……获取Firebase currentUser是同步的。