FirebaseMessaging.instance.getInitialMessage当我点击通知时返回空消息.<



我在我的Flutter应用程序中使用Firebase消息,当我单击通知背景时,我想去另一个特定的屏幕,因此FirebaseMessaging.instance.getInitialMessage()触发,但消息返回null。

对于前台通知,我使用onMessageOpenedApp,当我点击通知时,onMessageOpenedApp不触发

这是后端团队使用的对象,像这样

{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
}

这里是我的代码在main.dart

const AndroidNotificationChannel channel = AndroidNotificationChannel(
'high_importance', // id
'High Importance Notifications', // title
importance: Importance.high,
playSound: true);
final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
SessionManager sessionManager = SessionManager();
await Firebase.initializeApp();
//final sound = 'sound.mp3';
print('A bg message just showed up :  ${message.messageId}');
final android = AndroidInitializationSettings('@mipmap/ic_launcher');
final ios = IOSInitializationSettings(
requestSoundPermission: false,
requestBadgePermission: false,
requestAlertPermission: false,);
final settings = InitializationSettings(android: android,iOS: ios);
flutterLocalNotificationsPlugin.initialize(settings,);
if(message.data['title'].toString().toLowerCase()=="new request") {
sessionManager.getBadge().then((badge) {
if (badge != null) {
int x = badge + 1;
sessionManager.saveBadge(x);
print("notification number is " + x.toString());
}
else {
sessionManager.saveBadge(1);
}
});
}
flutterLocalNotificationsPlugin.show(
message.data.hashCode,
message.data['title'],
message.data['body'],
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
importance: Importance.high,
priority: Priority.high,
// sound: RawResourceAndroidNotificationSound(sound.split('.').first),
playSound: true,
icon: '@mipmap/ic_launcher',
),
));
/*NotificationApi.showNotification(
title: message.data['title'],
body: message.data['body'],
payload: "",
id:  int.parse(channel.id));*/
}

Future<void>  main() async{
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
await flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
alert: true,
badge: true,
sound: true,
);


runApp(MyApps());
// configLoading();
}

class MyApps extends StatefulWidget {
const MyApps({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() {
return MyApp();
}
}

class MyApp extends State<MyApps> {
static  ValueNotifier<int> strikeNotifier = ValueNotifier(0);
Color _primaryColor =  Color(0xff0d8b75);

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
builder: () => MaterialApp(
debugShowCheckedModeBanner: false,
home: SplashScreen(),
),
designSize: const Size(1080, 2280),
);
}

void showNotification(String title, String body) async {
await _demoNotification(title, body);
}
Future<void> _demoNotification(String title, String body) async {
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'channel_I', 'channel name',
showProgress: true,
priority: Priority.high,
playSound: true,
ticker: 'test ticker');
var iOSChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics);
await flutterLocalNotificationsPlugin
.show(0, title, body, platformChannelSpecifics, payload: 'test');
}
@override
void initState() {
super.initState();
FirebaseMessaging.instance.getInitialMessage().then((message) {
RemoteNotification notification = message!.notification!;
AndroidNotification android = message.notification!.android!;
if (notification != null && android != null) {
Navigator.push(context, MaterialPageRoute(builder: (context)=>Register()));
}
});
getToken().then((value) {
if(value!=null) {
AppConstants.firebaseToken = value;
}
});

FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
new FlutterLocalNotificationsPlugin();
var initializationSettingsAndroid =  AndroidInitializationSettings('@mipmap/ic_launcher');
var initializationSettingsIOS =  IOSInitializationSettings();
var initializationSettings =  InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
flutterLocalNotificationsPlugin.initialize(initializationSettings,
);

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
var data = message.data;
//  AndroidNotification? android = message.notification?.android;/

if (data != null ) {
if(data['title'].toString().toLowerCase()=="new request") {
SessionManager sessionManager = SessionManager(context);
sessionManager.getBadge().then((badge) {
if (badge != null) {
setState(() {
int x = badge + 1;
strikeNotifier.value = x;
sessionManager.saveBadge(x);
});
}
else {
strikeNotifier.value = 1;
sessionManager.saveBadge(1);
}
});
}
print("entered");
flutterLocalNotificationsPlugin.show(
data.hashCode,
data['title'],
data['body'],
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
playSound: true,
icon: '@mipmap/ic_launcher',
),
));
}
});
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
Navigator.push(context, MaterialPageRoute(builder: (context)=>DoneAndPaiedPagess(0)));
});

}
Future<String?> getToken() async{
String? token = await FirebaseMessaging.instance.getToken();
print("token is "+token!);
return token;
}
}

我找到解决办法了,

您需要将Payload添加到通知中,之后,您可以从通知中接收任何您想要的内容。

例如,我将通知标题传递给Payload,如下所示。

FirebaseMessaging.onMessage.listen((RemoteMessage message) {
var data = message.data;
//  AndroidNotification? android = message.notification?.android;/

if (data != null ) {
print("entered "+data['ID'].toString());
flutterLocalNotificationsPlugin.show(
data.hashCode,
data['title'],
data['body'],
NotificationDetails(
android: AndroidNotificationDetails(
channel.id,
channel.name,
playSound: true,
icon: '@mipmap/ic_launcher',
),
),payload: data['title']);
}
});
}

然后我可以在onSelectNotification

中接收它
void onSelectNotification(String? payload)async  {
print(" notification "+payload!);
if(payload.contains("response is created")){

Navigator.push(context, MaterialPageRoute(builder: (context)=>ResponsePage(ID: int.parse(id),)));
}

}

最新更新