Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Routes 动作后产生颤振路径?_Routes_Flutter_Navigator - Fatal编程技术网

Routes 动作后产生颤振路径?

Routes 动作后产生颤振路径?,routes,flutter,navigator,Routes,Flutter,Navigator,我试图在成功登录后自动返回菜单屏幕,但在生成小部件构建和/或上下文时遇到问题。我在一个无状态的小部件中做这件事。这是我的密码。我想在最后一次打印声明后调用route Future<Null> _handleSignIn() async { try { await _googleSignIn.disconnect(); GoogleSignInAccount googleUser = await _googleSignIn.signIn();

我试图在成功登录后自动返回菜单屏幕,但在生成小部件构建和/或上下文时遇到问题。我在一个无状态的小部件中做这件事。这是我的密码。我想在最后一次打印声明后调用route

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中的导航器