在 Flutter 中获取全局上下文

Muh*_*fay 2 dart flutter flutter-layout

有什么办法可以get the global context of Material App in Flutter。不是特定屏幕的上下文。

我正在尝试获取上下文,但它为我提供了特定屏幕的上下文,但我想要 MaterialApp 的上下文。

Muh*_*fay 80

如果上述解决方案不起作用,请尝试此解决方案。

  1. 创建类。这里它命名为NavigationService

    import 'package:flutter/material.dart';
    
    class NavigationService { 
      static GlobalKey<NavigatorState> navigatorKey = 
      GlobalKey<NavigatorState>();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在main.dart中设置MaterialApp的navigatorKey属性

    Widget build(BuildContext context) {
      return MaterialApp(
        navigatorKey: NavigationService.navigatorKey, // set property
      )
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 伟大的!现在您可以在任何您想要的地方使用,例如

    print("---print context: 
      ${NavigationService.navigatorKey.currentContext}");
    
    Run Code Online (Sandbox Code Playgroud)


Shu*_*oni 11

将 a 分配GlobalKey()MaterialApp您可以放在单独的类中的,我们称之为App

 @override
    Widget build(BuildContext context) {
      return MaterialApp(
        navigatorKey: App.materialKey, // GlobalKey()
      )
    }
Run Code Online (Sandbox Code Playgroud)

现在,无论您想要获取contextMaterialApp,您只需调用:

App.materialKey.currentContext
Run Code Online (Sandbox Code Playgroud)

我在这里打印MaterialApp context

print('Material App Context : ${App.materialKey.currentContext}'); 
Run Code Online (Sandbox Code Playgroud)

OUTPUT: flutter: Material App Context : MaterialApp-[GlobalKey#4fab4](state: _MaterialAppState#4bb44

  • 我是 flutter 的新手,你从哪里获得 App 类,因为我的还没有。 (2认同)
  • 是否存在不鼓励使用 GlobalKey 访问 BuildContext 的情况?要推送新路由或显示 SnackBar 或对话框,需要 BuildContext。为了避免将 BuildContext 实例作为参数传递,我想使用 GlobalKey 的 BuildContext。但我想知道是否有什么需要注意的地方。我想到的一个错误使用全局上下文的例子是动态 InheritedWidget 查找。 (2认同)
  • @Geoff 它是您自己构建的类,请参阅第二个答案 /sf/answers/4850960831/ (2认同)