Routes 动作后产生颤振路径?
我试图在成功登录后自动返回菜单屏幕,但在生成小部件构建和/或上下文时遇到问题。我在一个无状态的小部件中做这件事。这是我的密码。我想在最后一次打印声明后调用routeRoutes 动作后产生颤振路径?,routes,flutter,navigator,Routes,Flutter,Navigator,我试图在成功登录后自动返回菜单屏幕,但在生成小部件构建和/或上下文时遇到问题。我在一个无状态的小部件中做这件事。这是我的密码。我想在最后一次打印声明后调用route Future<Null> _handleSignIn() async { try { await _googleSignIn.disconnect(); GoogleSignInAccount googleUser = await _googleSignIn.signIn();
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);
}
根据我从您的问题中了解到的情况,您基本上需要设置登录按钮,以便在成功登录后将用户重定向到您希望他们在的任何位置 您可以按如下方式设置On Pressed call,从这里开始您应该很好:
onPressed: () {_handleSignIn().whenComplete( ()=>Navigator.of(context).pushNamed("/MyHome"));
}
请注意,不能在构建方法之外使用Navigator,因此始终需要在小部件中处理导航部分。查看对此答案的评论。根据我从您的问题中了解到的情况,您基本上需要设置登录按钮,以便在成功登录后将用户重定向到您希望他们到达的位置 您可以按如下方式设置On Pressed call,从这里开始您应该很好:
onPressed: () {_handleSignIn().whenComplete( ()=>Navigator.of(context).pushNamed("/MyHome"));
}
请注意,不能在构建方法之外使用Navigator,因此始终需要在小部件中处理导航部分。查看此答案的注释。还有另一种方法可以在没有用户交互的情况下完成此操作
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方法,而不使用wait。这是因为我们的目的是在等待登录检查时构建一个屏幕。检查完成后,导航器会处理其余部分。还有另一种方法可以在不需要用户交互的情况下完成检查
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方法,而不使用wait。这是因为我们的目的是在等待登录检查时构建一个屏幕。一旦检查完毕,导航器负责其余部分。只要您将当前小部件的上下文传递给导航器,您就可以访问导航器:onPressed:=>\u handleSignIncontext,然后使用该上下文推送到导航器的路径。\u handleSign只要将当前小部件的上下文传递给导航器,您就可以访问导航器:onPressed:=>_handleSignIncontext,然后使用该上下文将路线推送到_handleSignIn中的导航器