【问题标题】:How to navigate to specific MaterialPageRoute in app from a notification in Flutter如何从 Flutter 中的通知导航到应用程序中的特定 MaterialPageRoute
【发布时间】:2019-02-10 16:47:57
【问题描述】:

是否可以通过单击通知导航到应用程序中的特定 MaterialPageRoute?我在主屏幕中配置了通知:

void _configureNotifications() {
  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  _firebaseMessaging.requestNotificationPermissions();
  _firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) {
      _goToDeeplyNestedView();
    },
    onLaunch: (Map<String, dynamic> message) {
      _goToDeeplyNestedView();
    },
    onResume: (Map<String, dynamic> message) {
      _goToDeeplyNestedView();
    },
  );
}

_goToDeeplyNestedView() {
  Navigator.push(
      context,
      MaterialPageRoute(
          builder: (_) => DeeplyNestedView()));
}

问题是,当我这样配置它时,它只能从我配置通知的小部件中工作(我猜这是因为在 导航器.push()。是否有某种方法可以在不使用任何上下文的情况下从应用程序中的任何位置访问 MaterialPageRoute?

提前感谢您的回答。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    使用 GlobalKey 是个好主意的情况并不多,但这可能就是其中之一。

    当您构建MaterialApp(我假设您正在使用)时,您可以传入一个navigatorKey 参数,该参数指定用于导航器的键。然后,您可以使用此键访问导航器的状态。看起来像这样:

    class _AppState extends State<App> {
      final GlobalKey<NavigatorState> navigatorKey = GlobalKey(debugLabel: "Main Navigator");
    
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          navigatorKey: navigatorKey,
          home: new Scaffold(
            endDrawer: Drawer(),
            appBar: AppBar(),
            body: new Container(),
          ),
        );
      }
    }
    

    然后要使用它,您可以访问 navigatorKey.currentContext:

    _goToDeeplyNestedView() {
      navigatorKey.currentState.push(
        MaterialPageRoute(builder: (_) => DeeplyNestedView())
      );
    }
    

    【讨论】:

    • 我尝试了此设置,但仍然没有显示 onResume / onLaunch 页面中指定的页面。应用程序是否总是通过 main.dart?如果是这样,是否可以在那里定义路由,覆盖 onLaunch/onResume 中的路由设置?
    • @dazza5000,这也是我认为我面临的问题,但还不确定。你设法找出来了吗?成功了吗?
    • 我也试过这个设置,但它不起作用。它没有在onResume 回调方法中打开提到的屏幕。它只是在应用程序进入后台模式之前打开最后一个屏幕。
    • @DhavalKansara 哎呀,现在看这个,我认为我在那里的东西实际上不再有用了。我已将其编辑为直接使用 NavigatorState - 试试吧。
    • 是的 navigatorKey.currentState.push( MaterialPageRoute(builder: (_) =&gt; DeeplyNestedView()) ); 为我工作。
    【解决方案2】:

    初始化navigatorStateglobalkey

    final GlobalKey<NavigatorState> navigatorKey = GlobalKey(debugLabel: "Main Navigator");
    
    navigatorKey.currentState.push(
        MaterialPageRoute(builder: (_) => classname())
      );
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题并使用以下代码修复了它:

      1. 创建 1 个全局键,例如:

        final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey();
        
      2. 在构建方法中将键分配给 Scaffold :

        return Scaffold( key: _scaffoldKey,
        appBar: Container(), body:
        Container() );
        
      3. 在此之前打印 ('something') 以确保您的应用到达以下代码:

        Navigator.push(
                _scaffoldKey.currentContext,
                MaterialPageRoute(
                    builder: ( _) =>
                        NotificationDetailEn(notificationModel: model)));
        

      我认为这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2021-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 2018-06-27
        • 2020-08-22
        • 2020-05-01
        相关资源
        最近更新 更多