在执行动作后生成Flutter路由吗?
在执行动作后生成Flutter路由吗?
在成功登录后,我想要自动返回到我的菜单界面,但是我在生成小部件构建和/或上下文方面遇到了问题。我是在一个无状态小部件中进行这个操作的。以下是我的代码。我希望在最后一个打印语句后调用路由...
Future
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("开始吧");
print(_googleSignIn.currentUser.displayName);
print(FirebaseAuth.instance.currentUser);
}
问题的原因:
问题是由于_checkSignIn()方法被调用时没有使用"await"关键字,导致在进行登录检查时无法正确生成Flutter路由。
解决方法:
为了解决这个问题,可以在_build()方法中使用"await"关键字来等待_checkSignIn()方法完成后再继续执行后续操作。将_checkSignIn()方法改为异步方法,然后在_build()方法中使用"await"关键字来等待其完成。这样可以确保在进行登录检查后再进行路由导航。
修改后的代码如下:
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;
}
Widget build(BuildContext context) async {
await _checkSignIn(context);
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: const <Widget>[
CircularProgressIndicator(),
],
),
);
}
}
通过以上修改,问题应该就可以得到解决了。
问题的原因是需要在登录成功后设置按钮将用户重定向到指定页面。解决方法是在按钮的onPressed方法中添加代码,在登录成功后使用Navigator.of(context).pushNamed("/MyHome")将用户重定向到指定页面。需要注意的是,Navigator只能在build方法内部使用,所以在处理导航部分时,需要在小部件内部处理。可以通过将当前小部件的context传递给Navigator来访问它,并在_handleSignIn方法中使用该context将路由推送到Navigator中。
代码如下:
onPressed: () {_handleSignIn().whenComplete( () => Navigator.of(context).pushNamed("/MyHome"));
}
请注意,只要将当前小部件的context传递给Navigator,就可以访问它:`onPressed: () => _handleSignIn(context)`,然后在_handleSignIn中使用该context将路由推送到Navigator中。