【问题标题】:Generating Flutter route after action?动作后生成颤振路线?
【发布时间】:2018-02-11 15:24:40
【问题描述】:

我尝试在成功登录后自动返回菜单屏幕,但在生成小部件构建和/或上下文时遇到问题。我在无状态小部件中执行此操作。这是我的代码。我想在最后一个打印语句之后调用路由...

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);
  }

【问题讨论】:

    标签: routes flutter navigator


    【解决方案1】:

    根据我从您的问题中了解到的情况,您基本上需要设置登录按钮,以便在成功登录后将用户重定向到您希望他们到达的任何位置。

    您可以按如下方式设置 onPressed 调用,从这里开始应该没问题:

    onPressed: () {_handleSignIn().whenComplete( ()=>Navigator.of(context).pushNamed("/MyHome"));
                          }
    

    注意,您不能在构建方法之外使用 Navigator,因此您始终需要处理小部件中的导航部分。 查看对此答案的评论。

    【讨论】:

    • 您可以访问导航器,只要将当前小部件的context 传递给它:onPressed: () =&gt; _handleSignIn(context),然后使用该上下文将路由推送到_handleSignIn 中的导航器
    【解决方案2】:

    还有另一种无需用户交互的方式。

    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。根据状态调用导航器导航到下一页。

    _checkSignIn() 方法在构建方法中被调用,没有“等待”。这是因为我们的意图是在等待登录检查的同时构建一个屏幕。检查完成后,导航器会处理剩下的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2021-08-08
      • 2019-05-31
      • 2021-02-21
      • 2020-12-07
      相关资源
      最近更新 更多