Flutter 和 Firebase 管理员和普通用户登录

时间:2021-02-24 18:10:18

标签: firebase flutter

你好,我是 flutter 和 firebase 的新手,我在用户文档中有一个名为 admin 的字段,它是一个布尔值,我想在登录功能中检查这个布尔值。到目前为止我想到的是:

onPressed: () async {
  if (_formKey.currentState.validate()) {
    if (!await user.signIn(_email.text, _password.text)) {
      toast("Signin Faild");
    } else {
      if(await _firestore.collection('users').doc(_auth.currentUser.uid).get().)
        changeScreenReplacement(context, HomePage());
      toast("Signedin successfully");
    }
  }
},

我不知道在这部分该怎么做: if(await _firestore.collection('users').doc(_auth.currentUser.uid).get().)

我想在这里检查该字段是否等于 true 或 false 我该怎么做?

1 个答案:

答案 0 :(得分:0)

等待 get() 调用后,您将拥有一个 DocumentSnapshot 实例,您可以从中读取数据。

DocumentReference 上调用 get() 总是返回 DocumentSnapshot 实例,即使文档不存在于数据库中。所以你可能还需要检查一下。

如果数据库中不存在这样的文档,那么在 DocumentSnapshot 上调用 data() 也会返回 null。

所以这至少可以写成两种方式。

显式检查数据库中是否存在文档。

final userSnapshot = await _firestore.collection('users').doc(_auth.currentUser.uid).get();

if(userSnapshot.exists) {
  if(userSnapshot.data()['admin'] == true) {
    toast('User is admin');
  } else {
    toast('User not admin');
  }
} else {
  toast('User document not exist in database');
}

或者以简短的方式,忽略用户文档可能不存在的事实。

final userSnapshot = await _firestore.collection('users').doc(_auth.currentUser.uid).get();
if(((await _firestore.collection('users').doc(_auth.currentUser.uid).get()).data() ?? const {})['admin'] == true) {
  toast('User is admin');
} else {
  toast('User not admin or user document not exist');
}