我想在用户单击fcm
通知时浏览特定页面。问题是导航器不适用于回调方法。
FLUTTER_NOTIFICATION_CLICK
。而且没有丢失的数据。Navigator
和showDialog
不起作用。所以我想问题与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(...)
。但是不行。
我该如何解决?
答案 0 :(得分:4)
您必须将代码从App文件移动到小部件中。我会说创建一个主页并在其中执行导航,将该主页作为您的MaterialApp的子级,并在主页视图中注册回调。
我还没有弄清楚为什么那里的上下文不起作用,但是最近我经历了同样的事情,不得不将导航移到更深的视图中。