gpt4 book ai didi

ios - 使用导航处理 Flutter 中的身份验证状态

转载 作者:IT王子 更新时间:2023-10-29 06:51:59 28 4
gpt4 key购买 nike

我正在使用 Google Sign In 处理 Flutter 应用中的用户身份验证。这对于单 View 应用程序(无路由)非常有用,但是一旦我尝试添加一些路由并有效地管理路由,事情就会变得非常棘手。

如果我错了,请纠正我,但我想我想要的是顶层的有状态小部件,它控制我登录的变量和身份验证方法。这个顶级有状态小部件还控制着我的路由。以下是我当前设置的一些片段:

class SignInState extends State<SignIn> {
GoogleSignInAccount _currentUser;
...

Future<Null> _handleSignIn() async {
try {
await _googleSignIn.signIn();
} catch (error) {
print(error);
}
}

Future<Null> _handleSignOut() async {
_googleSignIn.disconnect();
}

@override
Widget build(BuildContext context) {
return new MaterialApp(
title: _pageTitle,
home: new Home(),
routes: <String, WidgetBuilder> {
"/": (BuildContext context) => new Home(),
"/settings": (BuildContext context) => new Settings(),
"/login": (BuildContext context) => new Login()
},
...
);
}
}

我在这里的假设是我的状态会传递到嵌套的小部件中,但我没有在 Home() 中看到 _currentUser 变量。

在其他框架中,您可以指定在路由加载时运行的方法,如果有一种优雅的方法可以在加载路由之前检查 _currentUser 是否存在,这样我就可以在用户不存在时推送新路由,那就太好了已登录。

如果有人有在 Flutter 应用程序中结合路由和身份验证的经验,我将非常感谢朝着正确方向迈出的一步。我发现的大多数教程都是针对其中之一的。

谢谢!

最佳答案

如果您将SignIn 小部件设置为InheritedWidget ,并向其中添加一些包含您的用户状态的属性(比方说 userState),您可以向其中添加这样的方法:

static UserState of(BuildContext context, { bool nullOk: false }) {
assert(context != null);
assert(nullOk != null);
final SignIn signInWidget = context.inheritFromWidgetOfExactType(SignIn);
if (signInWidget != null)
return signInWidget.userState;
if (nullOk)
return null;
throw new FlutterError(
'Attempted to find UserState without a SignInWidget parent.\n'
'The context used was:\n'
' $context'
);
}

然后你就可以打电话了

SignIn.of(context)

在您的 route 获取 UserState

还有其他方法可以做到这一点 - 例如,将您的数据放在 redux 存储中,或者创建回调链(例如,在您的 SignInWidget 上公开一个回调,该回调会传递给子路由)。这可能是最干净的内置方式,特别是如果您打算让这个小部件无论如何都位于树的顶部 - 但如果您采用其他一些状态管理策略(例如使用 redux),您可能会想考虑使用它。

关于ios - 使用导航处理 Flutter 中的身份验证状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49143923/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com