为什么在 flutter 中点击通知时路由不起作用? (项目基于GetX和flutter本地推送通知包)

why routing is not working when tap on the notification in flutter? ( the project is based on GetX and flutter local push notification package )

美好的一天。 我知道我们使用 onSelectNotification 属性 在用户点击通知时使用 flutter 本地推送通知包来获取回调。

  Future<void> _initialize() async {
    await _configureLocalTimeZone();
    AndroidInitializationSettings initializationSettingsAndroid =
        AndroidInitializationSettings('@mipmap/ic_launcher');

    IOSInitializationSettings initializationSettingsIOS =
        IOSInitializationSettings(
            onDidReceiveLocalNotification: _onDidReceiveLocalNotification);

    InitializationSettings initializationSettings = InitializationSettings(
        android: initializationSettingsAndroid, iOS: initializationSettingsIOS);

    await _flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: _onSelectNotification);        // This is for the callback
  }

这是 _onSelectsNotification 函数。

  Future _onSelectNotification(String payload) async {
    if (payload != null) {
      print('notification payload: $payload');
    }
    BuildContext context;
    await Navigator.of(context)
        .push(MaterialPageRoute(builder: (BuildContext context) {
      return NotificationsView();
    }));                           // ***** This is not working. with no error.
  }

我不确定上下文使用什么。我认为由于上下文值,通往 NotificationView() 的下一条路线不起作用。 你能帮我解决这个问题吗? 我现在正在使用 GetX 进行状态管理。

谢谢。

我用 Get.toNamed() 解决了这个问题 我的错误是没有在 _onSelectNotification 函数中返回。

  Future _onSelectNotification(String payload) async {
    if (payload != null) {
      print('notification payload: $payload');
    }
    return Get.toNamed(Routes.NOTIFICATIONS);
  }

效果很好。

但我仍然不知道如何从另一个状态获取上下文class。 在前面的post中,我为上下文传递了null。 我知道这是错误的。如何获得?

代码无法运行,因为在您调用 Navigator 时,小部件尚未完成构建。一个简单的解决方法是用 Future 包裹 Navigator.of(context),像这样:

Future.delayed(Duration.zero).then((_){
Navigator.of(context).push(
    MaterialPageRoute(builder: (BuildContext context) {
      return NotificationsView();
    }
  ));
});