如何从 Flutter 中的通知导航到应用程序中的特定 MaterialPageRoute

Posted

技术标签:

【中文标题】如何从 Flutter 中的通知导航到应用程序中的特定 MaterialPageRoute【英文标题】:How to navigate to specific MaterialPageRoute in app from a notification in Flutter 【发布时间】: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?

提前感谢您的回答。

【问题讨论】:

【参考方案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 个全局键,例如:

    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey();
    

    在构建方法中将键分配给 Scaffold :

    return Scaffold( key: _scaffoldKey,
    appBar: Container(), body:
    Container() );
    

    在此之前打印 ('something') 以确保您的应用到达以下代码:

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

我认为这会有所帮助。

【讨论】:

以上是关于如何从 Flutter 中的通知导航到应用程序中的特定 MaterialPageRoute的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - onLaunch 中的 Firebase 云消息导航不起作用

如何从后台打开我的应用程序并导航到接收通知消息的页面?

Flutter 中的 AndroidManifest 中缺少默认通知通道元数据

如何根据 Flutter 中的条件导航到页面

Flutter MaterialPageRoute 导航到黑色背景的屏幕时如何解决?

Flutter 中的索引堆叠。如何在所有其他小部件之上显示容器?