行动后产生颤振路线?

时间:2017-09-03 00:17:24

标签: routes flutter navigator

我正在尝试在成功登录后自动路由回我的菜单屏幕,并且我在生成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);
  }

2 个答案:

答案 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()方法,而不用“等待”。这是因为我们的目的是仅在等待登录检查时构建屏幕。完成检查后,导航器会处理其余的工作。