【问题标题】:Logout from non-Widget class从非小部件类注销
【发布时间】:2019-09-22 11:46:14
【问题描述】:

我的应用程序向服务器发出多个请求。有时服务器可能会要求用户重新登录,类似于这个问题: Flutter: how to force an application restart (in production mode)?

我可以这样做,

      Navigator.pushAndRemoveUntil(
          context,
          MaterialPageRoute(builder: (context) => LoginPage()),
          (Route<dynamic> route) => false);

但我需要有一个 BuildContext。

有没有办法在非 Widget 类中获取当前(最近使用的)上下文?我知道每次进行服务器调用时我都可以将上下文作为参数传递,但我希望找到一种侵入性较小的方法来执行此操作。

【问题讨论】:

  • 每个小部件都有自己的context,在构建阶段分配。什么标准确定其中哪一个是“最近使用”的?
  • 如果你需要上下文,你必须通过它。

标签: flutter


【解决方案1】:

您寻找context 的原因是因为您想获得Navigator。 (所有Navigator.pushXXX 调用都会在后台执行Navigator.of(context) 以在小部件树顶部附近找到(通常)唯一的导航器。)

如果您真正想要的只是访问导航器,还有另一种方法可以做到这一点。使您的应用有状态并在其状态中放置一个全局键。

  GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

在应用程序的构建(或顶部继承的小部件的构建)中,当您创建材料应用程序时,将密钥传递给它。

  @override
  Widget build(BuildContext context) {
    return _SomeInherited(
      data: this,
      child: MaterialApp(
        navigatorKey: navigatorKey,
        title: 'Some Title',
        theme: someTheme,
        home: FrontPage(),
      ),
    );
  }

现在,从应用层面,你可以使用navigatorKey.currentState.pushXXX

【讨论】:

  • 效果很好,谢谢你的食谱!我还注意到 navigatorKey 让我可以访问 currentContext 和 currentWidget。
猜你喜欢
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2018-10-23
  • 2017-02-04
相关资源
最近更新 更多