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

时间:2018-09-05 13:52:05

标签: dart flutter

是否可以通过通知单击导航到应用程序中的特定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()));
}

问题是,当我像这样配置它时,它只能从配置通知的窗口小部件中唤醒(我猜这是因为在其中使用了“上下文”  Navigator.push()。有什么方法可以在不使用任何上下文的情况下从应用程序中的任何位置访问MaterialPageRoute?

预先感谢您的回答。

3 个答案:

答案 0 :(得分:4)

在很多情况下,使用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() {
  Navigator.push(navigatorKey.currentContext, MaterialPageRoute(builder: (_) => DeeplyNestedView()));
}

答案 1 :(得分:1)

初始化navigatorState全局键

final GlobalKey<NavigatorState> navigatorKey = GlobalKey(debugLabel: "Main Navigator");

navigatorKey.currentState.push(CupertinoPageRoute(builder: (context)=>classname()))

答案 2 :(得分:0)

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

  1. 创建1个全局密钥:

    final GlobalKey _scaffoldKey = new GlobalKey();

  2. 在构建方法中为Scaffold分配密钥:

    返回脚手架(键:_scaffoldKey,    appBar:Container(),主体:    Container());

  3. 在此之前
  4. print('something'),以确保您的应用可以访问以下代码:

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

我认为这会有所帮助。