如何在 FireStore 中获取 isAdmin 字段并在 Flutter 中检查它是真还是假

Posted

技术标签:

【中文标题】如何在 FireStore 中获取 isAdmin 字段并在 Flutter 中检查它是真还是假【英文标题】:How to get the isAdmin field in FireStore and check if it's true or false in Flutter 【发布时间】:2021-05-19 19:12:05 【问题描述】:

大家好,我正在用颤振制作一个应用程序,它对普通用户管理员和未经身份验证的用户有不同的视图,但是我要使用的逻辑不起作用,我不知道为什么。

P.S 这里我只是想区分管理员和普通用户。

这是我想要做的:

Future<bool> isAdmin() async 
    final currentUserUid = _firebaseAuth.currentUser.uid;
    //What I'm trying to do here is get my isAdmin field which is created when a user is created
    final DocumentSnapshot db = await 
          databaseReference.collection('users').doc(currentUserUid).get();
    return db.data().containsKey('isAdmin');
  

这就是我尝试实现它的方式

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../screens/auth/admin/admin_tab_bar_screen.dart';
import '../../screens/auth/user_tab_bar_screen.dart';
import '../../providers/auth.dart';

class AuthTabBarScreen extends StatelessWidget 
  static const routeName = 'auth-tab-bar-view';
  @override
  Widget build(BuildContext context) 
    final checkUserRole = Provider.of<Auth>(context, listen: false).isAdmin();

    // Here I want to check the Value I'm returning if its true
    if(checkUserRole == true)
      return AdminTabBarScreen();
     else 
      return UserTabBarScreen();
    
  

【问题讨论】:

【参考方案1】:

您可以使用 FutureBuilder 在构建之前等待未来(在您的情况下为 isAdmin())。 snapshot.datafuture 的值。

class AuthTabBarScreen extends StatelessWidget 
  static const routeName = 'auth-tab-bar-view';
  @override
  Widget build(BuildContext context) 
    return FutureBuilder(
      future: Provider.of<Auth>(context, listen: false).isAdmin(),
      builder: (context, snapshot) => snapshot.hasData
          ? snapshot.data // if isAdmin() is true
              ? AdminTabBarScreen() // return Admin
              : UserTabBarScreen() // else if false, return UserTab
          : Loading(), // while you're waiting for the data, show some kind of loading indicator
    );
  

isAdmin() 返回Future&lt;bool&gt;,这是一个未来值,因此当您比较Future&lt;bool&gt;bool 时,您将收到一个相等错误,因为一个是Future,另一个是bool。使用FutureBuilder(),您的应用程序将等待Provider.of&lt;Auth&gt;...isAdmin() 返回一个值或snapshotsnapshot 是您未来的异步值,因此调用 snapshot.dataawait Provider.of&lt;Auth&gt;...isAdmin() 相同,这就是为什么 snapshot.data 返回 bool 而不是 Future&lt;bool&gt; 的原因。了解 futures、async、await 如何工作可能会有所帮助documentation。

【讨论】:

它可以工作,但是我不明白如何,请您从构建器和下面解释它是如何工作的,以及它如何检查 isAdmin 值是真还是假。 谢谢,在我检查了flutter SDK中的文档之后,现在我也从你提供的链接中理解了。【参考方案2】:

我没有测试它,但这可能对你有用。 基本上db.data() 是一张地图,所以如果你搜索你的钥匙,你会得到你想要的 像这样

Future<bool> isAdmin() async 
    final currentUserUid = _firebaseAuth.currentUser.uid;
    final DocumentSnapshot db = await 
          databaseReference.collection('users').doc(currentUserUid).get();
    return db.data()['isAdmin'];
  

【讨论】:

为了获得它的工作价值,但是我如何使用从第二个代码中的 isAdmin 方法获得的值,因为当我尝试在第二个代码中尝试 AuthTabBarScreen它不起作用,因为它说“平等运算符== 调用不相关类型的引用。”.?? @NiiTii isAdmin() 返回一个未来,因此您需要在 Provider.of 前面添加 'await' 并使其成为异步函数。也将其从 build() 方法中取出 @Karen 我在构建方法“Future isUserAdmin() asyncreturn await Provider.of...”之外创建了一个新函数,并尝试检查该方法if 语句,但它仍然不起作用,它一直说“ Equality operator == invocation with references of unrelated types.”。我该怎么办? @NiiTii 我用不同的方法发布了答案

以上是关于如何在 FireStore 中获取 isAdmin 字段并在 Flutter 中检查它是真还是假的主要内容,如果未能解决你的问题,请参考以下文章

如何在 null 上修复对成员函数 isAdmin() 的调用

如何在 Firestore (iOS) 中获取对象

FIRESTORE - 如何在文档中获取集合的值?

如何在flutter中从云Firestore中获取数据?

如何在flutter中获取firestore文档的documentid?

如何在 Firebase Firestore 中获取内部集合