如何在 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.data
是future
的值。
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<bool>
,这是一个未来值,因此当您比较Future<bool>
和bool
时,您将收到一个相等错误,因为一个是Future
,另一个是bool
。使用FutureBuilder()
,您的应用程序将等待Provider.of<Auth>...isAdmin()
返回一个值或snapshot
。 snapshot
是您未来的异步值,因此调用 snapshot.data
与 await Provider.of<Auth>...isAdmin()
相同,这就是为什么 snapshot.data
返回 bool
而不是 Future<bool>
的原因。了解 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以上是关于如何在 FireStore 中获取 isAdmin 字段并在 Flutter 中检查它是真还是假的主要内容,如果未能解决你的问题,请参考以下文章
如何在 null 上修复对成员函数 isAdmin() 的调用