导航器在Firebase消息回调方法中不起作用

时间:2019-02-18 04:57:02

标签: dart flutter firebase-cloud-messaging

我想在用户单击fcm通知时浏览特定页面。问题是导航器不适用于回调方法。

  • 我的设备收到的推送通知很好。
  • 我在noti正文上添加了FLUTTER_NOTIFICATION_CLICK。而且没有丢失的数据。
  • 回调方法运行良好,但是只有NavigatorshowDialog不起作用。所以我想问题与context有关。
// main.dart

void main() {
  SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]);
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _AppState();
}

class _AppState extends State<MyApp> {
  final FirebaseMessaging _fm = new FirebaseMessaging();
  final GlobalKey<NavigatorState> navigatorKey =
  GlobalKey(debugLabel: 'Main Navigator');

  final routes = {
//    skip on question
  };

  fcmSetting(context) {
    _fm.configure(
      onLaunch: (Map<String, dynamic> message) {
        pushTo(message);  // not work
      },
      onMessage: (Map<String, dynamic> message) {
        print('onMessage $message');  // it run well
        onMessageSend(message);  // but it's not
      },
      onResume: (Map<String, dynamic> message) {
        pushTo(message); // not work
      },
    );
    _fm.requestNotificationPermissions(
        const IosNotificationSettings(sound: true, badge: true, alert: true));

    _fm.getToken().then((token) {
      DBFactory.getInstance().insert('fcmToken', token);
    });
  }

  pushTo(message) {
    if (message['type'] == 'notice') {
      Navigator.of(navigatorKey.currentContext).push(
          MaterialPageRoute(builder: (_) => NoticeDetailScreen(message['id'])));
    }
  }

  onMessageSend(message) {
    showDialog(
        context: context,
        builder: (bd) => new AlertDialog(
          title: LText('메세지 도착!'),
          content: LText('$message'),
          actions: <Widget>[
            LFlatButton(
                text: '확인', onPressed: () => Navigator.of(bd).pop()),
          ],
        ));
  }

  @override
  Widget build(BuildContext context) {
    fcmSetting(context);
    return new MaterialApp(
      navigatorKey: navigatorKey,
      title: 'App title',
      initialRoute: '/',
      routes: routes,
    );
  }
}

我已经尝试过Navigator.of(navigat Navigator.of(navigatorKey.currentContext).push(...)orKey.currentContext).push(...)Navigator.of(context).push(...)。但是不行。

我该如何解决?

1 个答案:

答案 0 :(得分:4)

您必须将代码从App文件移动到小部件中。我会说创建一个主页并在其中执行导航,将该主页作为您的MaterialApp的子级,并在主页视图中注册回调。

我还没有弄清楚为什么那里的上下文不起作用,但是最近我经历了同样的事情,不得不将导航移到更深的视图中。