成功登录后,我试图自动将返回到菜单屏幕,并且在生成小部件构建和/或上下文时遇到了困难。我正在用无状态的小部件进行此操作。这是我的代码。我想在上次打印语句之后打电话...
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);
}
从我从您的问题中了解的内容,您基本上需要设置您的登录按钮,以将用户重定向到成功签名后的任何位置。
您可以按以下方式设置您的打开电话,您应该可以从这里进行:
onPressed: () {_handleSignIn().whenComplete( ()=>Navigator.of(context).pushNamed("/MyHome"));
}
注意您无法在构建方法之外使用导航器,因此您始终需要处理小部件内的导航零件。检查此答案的评论。
没有用户交互的另一种方法可以做到。
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()方法检查用户是否已经签名。它基于signin状态返回Globals.SignInmode。基于状态,导航器被要求导航到下一页。
_checkSignin()方法在没有"等待"的构建方法中调用。这是因为我们的目的是在等待签名检查时仅构建屏幕。检查完成后,导航器会处理其余的。