从flutter中的FCM回调导航到特定屏幕



下面是我的推送通知管理器。我想在收到通知时导航到特定的屏幕。请告诉我我做错了什么?

提前感谢

class PushNotificationsManager {
PushNotificationsManager._();
factory PushNotificationsManager() => _instance;
static final PushNotificationsManager _instance =
PushNotificationsManager._();
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
bool _initialized = false;
Future<void> init() async {
if (!_initialized) {
// For iOS request permission first.
_firebaseMessaging.requestNotificationPermissions();
_firebaseMessaging.configure();
// For testing purposes print the Firebase Messaging token
String token = await _firebaseMessaging.getToken();
print("FirebaseMessaging token****: $token");
_initialized = true;
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("onMessage: $message");
print("FirebaseMessaging token: $token");
print('hi');
try {
Navigator.pushAndRemoveUntil(
navigatorKey.currentContext,
MaterialPageRoute(
builder: (context) => ChangeNotifierProvider(
create: (context) => CategoryListViewModel(),
child: CategoryListPage(),
),
),
(Route<dynamic> route) => false);
} catch (e) {
print("Exeeee:::" + e.toString());
}
print("found");
},
onLaunch: (Map<String, dynamic> message) async {
print("onLaunch: $message");
},
onResume: (Map<String, dynamic> message) async {
print("onResume: $message");
},
);
}

}}

flatter_local_notifications 3.0.2库可用于在应用程序处于前台时添加通知。这提供了一个选项,可以在点击导航库链接时导航到特定页面

添加一个全局键来保持状态,并在收到消息时使用它来获取当前上下文。

final GlobalKey<NavigatorState> navigatorKey =
new GlobalKey<NavigatorState>();

使用下面的键。

child: MaterialApp(
navigatorKey: navigatorKey,

声明以下内容以初始化firebase

FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();

在初始化状态下添加以下代码

@override
void initState() {
super.initState();
_firebaseMessaging.requestNotificationPermissions();
_firebaseMessaging.configure();
var initializationSettingsAndroid =
AndroidInitializationSettings('mipmap/ic_launcher');
var initializationSettingsIOs = IOSInitializationSettings();
var initSetttings = InitializationSettings(
android: initializationSettingsAndroid, iOS: initializationSettingsIOs);
flutterLocalNotificationsPlugin.initialize(initSetttings,
onSelectNotification: onSelectNotification);
// For testing purposes print the Firebase Messaging to
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("onMessage@@@: $message");
String token = await _firebaseMessaging.getToken();
print("FirebaseMessaging token****: $token");
try {
showNotification();
} catch (e) {
print("Exeeee:::" + e.toString());
}
},
onLaunch: (Map<String, dynamic> message) async {
PushNotificationsManager.navigationHandler(
navigatorKey.currentContext, "Test");
},
onResume: (Map<String, dynamic> message) async {
PushNotificationsManager.navigationHandler(
navigatorKey.currentContext, "Test");
},
);
}

另外两种方法用于在应用程序处于前台时显示通知,点击导航

Future onSelectNotification(String payload) {
try {
PushNotificationsManager.navigationHandler(
navigatorKey.currentContext, "Test");
} catch (e) {
print("Navigation:::" + e.toString());
}
}
showNotification() async {
var android = AndroidNotificationDetails('id', 'channel ', 'description',
priority: Priority.high, importance: Importance.max);
var ios = IOSNotificationDetails();
var platform = new NotificationDetails(android: android, iOS: ios);
try {
await flutterLocalNotificationsPlugin.show(
0, 'Flutter devs', 'Flutter Local Notification Demo', platform,
payload: 'Welcome to the Local Notification demo');
} catch (e) {
print("Platform Exee:::" + e.toString());
}
}

可以在PushNotificationsManager.navigationHandler((.中编写自己的自定义导航代码

您所做的是正确的,但只做了一半。如果你想在应用程序打开/后台/关闭时工作,你还必须在所有其他条件下处理何时收到通知。然而,为了进行导航,您需要上下文,但没有上下文。您可以使用全局键进行导航,也可以在这里阅读本指南,以便在没有上下文的情况下轻松导航。

使用以下中的get_it包设置导航服务

locator.registerLazySingleton(() => NavigationService());

在您的PushNotification Manager中获取一个服务实例,如以下

final NavigationService _navigationService = locator<NavigationService>();

然后用它导航到你想要的屏幕,就像这个

_navigationService.navigateTo(CreatePostViewRoute);

以下是他们的推送通知处理指南超级简单,开箱即用

最新更新