我正在尝试在成功登录后自动路由回我的菜单屏幕,并且我在生成Widget构建和/或上下文时遇到问题。我在无状态小部件中这样做。这是我的代码。我想在最后一次打印声明之后打电话给路线......
Future<Null> _handleSignIn() async {
try {
await _googleSignIn.disconnect();
GoogleSignInAccount googleUser = await _googleSignIn.signIn();
GoogleSignInAuthentication googleAuth = await googleUser.authentication;
print(googleAuth.idToken);
await FirebaseAuth.instance.signInWithGoogle(idToken: googleAuth.idToken, accessToken: googleAuth.accessToken);
} catch (error) {
print(error);
}
print("Let's Do This");
print(_googleSignIn.currentUser.displayName);
print(FirebaseAuth.instance.currentUser);
}
答案 0 :(得分:2)
根据我的理解,您基本上需要设置登录按钮,将用户重定向到成功登录后的任何位置。
你可以按照以下方式设置你的onPressed电话,你可以从这里开始:
onPressed: () {_handleSignIn().whenComplete( ()=>Navigator.of(context).pushNamed("/MyHome"));
}
注意您不能在构建方法之外使用Navigator,因此您始终需要处理小部件中的导航部分。 检查此答案的评论。
答案 1 :(得分:0)
还有另一种无需用户干预的方式。
class SplashScreen extends StatelessWidget {
Future<bool> _checkSignIn(BuildContext context) async {
await globals.checkSignIn();
globals.intialRoute = '/';
if (globals.signInMode == SignInMode.SignedIn) {
Navigator.of(context).pushNamedAndRemoveUntil('/', ModalRoute.withName('/splash'));
} else {
Navigator.pushReplacementNamed(context, '/login');
}
return true;
}
@override
Widget build(BuildContext context) {
_checkSignIn(context);
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: const <Widget>[
CircularProgressIndicator(),
],
),
);
}
}
globals.checkSignIn()方法检查用户是否已经登录。它根据登录状态返回globals.signInMode。根据状态,将调用导航器导航到下一页。
在build方法中调用_checkSignIn()方法,而不用“等待”。这是因为我们的目的是仅在等待登录检查时构建屏幕。完成检查后,导航器会处理其余的工作。