Flutter - 如何使用 Firebase Auth 访问 StreamBuilder 中未来的价值
我正在对我正在构建和使用云功能和自定义声明的基于订阅的应用程序使用 Firebase 身份验证,我确保用户只有在拥有有效订阅的情况下才能登录。
我的应用程序有一个登录页面,用于检查用户是否已登录,如果登录,则将他们带到应用程序主页。如果没有,则会显示登录屏幕。这是它的代码:
class LandingPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthBase>(context, listen: false);
return StreamBuilder<User?>(
stream: auth.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
User? user = snapshot.data;
user?.reload();
user = snapshot.data;
if (user == null || user.emailVerified == false) {
return SignInHomePage.create(context);
}
return Provider<User?>.value(
value: user,
child: DisclaimerAcceptanceHomeScreen(
userName: user.displayName,
),
);
} else {
return Scaffold(
body: Center(
child: PlatformCircularProgressIndicator(),
),
);
}
});
}
}
这非常适合获取用户数据并显示相关屏幕。唯一的问题是,我不知道如何将用户的订阅状态添加到此,以确保只有具有有效订阅的用户才会被定向到应用程序的主页。订阅状态自定义声明将作为未来返回。理论上,我想使用这样的东西:
final idTokenResult =
await FirebaseAuth.instance.currentUser?.getIdTokenResult(true);
然后:
idTokenResult?.claims!['status']
将用户返回到登录屏幕的理想条件是:
user == null || user.emailVerified == false || idTokenResult?.claims!['status'] != 'active'
这确实在异步/等待函数中工作,但您会看到我的登陆页面是无状态的小部件并且不是异步的。
如何修改着陆页代码,以允许我获取未来“状态”自定义声明值?我将不胜感激对此的任何建议。谢谢你!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您是否考虑过在调用
getIdTokenResult
时使用FutureBuilder
?或者,您可以在
StreamBuilder
>FirebaseAuth.instance.idTokenChanges() 以获取有关 ID 令牌的所有更新的通知。Did you consider using a
FutureBuilder
around the call togetIdTokenResult
?Alternatively you can use a
StreamBuilder
onFirebaseAuth.instance.idTokenChanges()
to get notified of all updates to the ID token.根据弗兰克(Frank)的评论,我修改了我的
streambuilder
includefuturebuilder
,其中未来是getIdTokenResult(true)
函数。这就是上述代码的样子,如所述进行了修改:现在允许我在让他们访问应用程序之前检查用户的订阅状态。
Based on Frank's comment, I modified my
StreamBuilder
to includeFutureBuilder
, where the future was thegetIdTokenResult(true)
function. This is what the above code looks like, modified as described:This now allows me to check the user's subscription status before letting them have access to the app.