Flutter Dev نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 السلام عليكم ورحمة الله وبركاته تحيه طيبه للجميع لدي كلاس استقبال من خلاله الاشعارات من FCM الكلاس يعمل جيدا ولكن توجد مشكله واحده وهيا ان كل اشعار ياتيني يحذف الذي سبقه بمعنى لم يتم عرض الا اشعار واحد وهو اخر اشعار في لوحة اشعارات الاندرويد او ما يسمى notification bar هل يوجد حل لحل هذا المشكله ؟ الكلاس المستعمل كامل Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { print("Handling a background message: ${message.messageId}"); } class ShowNotifications { static FirebaseMessaging messaging = FirebaseMessaging.instance; static void showNotification(String title, String body) async { await _demoNotification(title, body); } static Future<void> _demoNotification(String title, String body) async { var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'channel_ID', 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show(0, title, body, platformChannelSpecifics, payload: 'test'); } static FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); static void initialization(){ var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettingsIOS = new IOSInitializationSettings(); var initializationSettings = new InitializationSettings( android: initializationSettingsAndroid, iOS: initializationSettingsIOS); flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification); } static Future onSelectNotification(String payload) async { showDialog( // context: context, builder: (_) { return new AlertDialog( title: Text("PayLoad"), content: Text("Payload : $payload"), ); }, ); } static notification() async { await Firebase.initializeApp();messaging = FirebaseMessaging.instance; FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); NotificationSettings settings = await messaging.requestPermission( alert: true, badge: true, provisional: false, sound: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { print('User granted permission'); FirebaseMessaging.onMessage.listen((RemoteMessage message) { // Parse the message received PushNotification notification = PushNotification( title: message.notification?.title, body: message.notification?.body, dataTitle: message.data['title'], dataBody: message.data['body'], ); showNotification( notification.title, notification.body); }); } else { print('User declined or has not accepted permission'); } } } اقتباس
1 Wael Aljamal نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 حاول إعطاء رقم فريد لكل إشعار، مثل المعرف الخاص به لا تجعله نص ثابت لأنه سوف يتم استبدال الإشعار الحالي بالإشعار الجديد الذي له نفس المعرًف. حاول وضع قيمة متغيرة مثل نص متغير أو قيمة الوقت الفعلي أو قيمة عشوائية وهذا سيعمل على الحفاظ على كل الإشعارات. AndroidNotificationDetails( 'channel_ID', 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); تحديدا channel_ID. ضع مكانة رقم عشوائي مثلا: import 'dart:math'; main() { var rng = new Random(); rng.nextInt(100); } أو عداد في البرنامج أو قيمة الوقت. new DateTime.now().microsecondsSinceEpoch مكان channel_ID 1 اقتباس
0 Flutter Dev نشر 28 مايو 2021 الكاتب أرسل تقرير نشر 28 مايو 2021 بتاريخ 28 دقائق مضت قال Wael Aljamal: حاول إعطاء رقم فريد لكل إشعار، مثل المعرف الخاص به لا تجعله نص ثابت لأنه سوف يتم استبدال الإشعار الحالي بالإشعار الجديد الذي له نفس المعرًف. حاول وضع قيمة متغيرة مثل نص متغير أو قيمة الوقت الفعلي أو قيمة عشوائية وهذا سيعمل على الحفاظ على كل الإشعارات. AndroidNotificationDetails( 'channel_ID', 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); تحديدا channel_ID. ضع مكانة رقم عشوائي مثلا: import 'dart:math'; main() { var rng = new Random(); rng.nextInt(100); } أو عداد في البرنامج أو قيمة الوقت. new DateTime.now().microsecondsSinceEpoch مكان channel_ID اهلا بيك اخي الكريم قمت بتجربه بشكل التالي ووضع الوقت وتاريخ وثواني حتى يتم الفرق ولكن مع الاسف المشكله ما زالت مستمره static Future<void> _demoNotification(String title, String body) async { //String DataOfToday; var date = new DateTime.now().toString(); var dateParse = DateTime.parse(date); var formattedDate = "${dateParse.day}-${dateParse.month}-${dateParse.year}"; // DataOfToday = formattedDate.toString(); var androidPlatformChannelSpecifics = AndroidNotificationDetails( //'channel_ID', 'channel name', 'channel description', formattedDate, 'channel name', 'channel description', importance: Importance.max, playSound: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show(0, title, body, platformChannelSpecifics, payload: 'test'); } 1 اقتباس
1 Wael Aljamal نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 بتاريخ 3 دقائق مضت قال مروان مروان3: قمت بتجربه بشكل التالي ووضع الوقت وتاريخ وثواني حتى يتم الفرق ولكن مع الاسف المشكله ما زالت مستمره عفوا علينا تعديل هذه أيضا: await flutterLocalNotificationsPlugin .show(0, title, body, platformChannelSpecifics, payload: 'test'); استبدل الرقم 0 يتم تجميع الإشعارات حسب channel_id التي يتم تمريرها في الدالة التالية. لذلك وجب بناء قناة للإشعارات و توجيه الإشعار الجديد لها. 1 اقتباس
0 Flutter Dev نشر 28 مايو 2021 الكاتب أرسل تقرير نشر 28 مايو 2021 بتاريخ 7 دقائق مضت قال Wael Aljamal: عفوا علينا تعديل هذه أيضا: await flutterLocalNotificationsPlugin .show(0, title, body, platformChannelSpecifics, payload: 'test'); استبدل الرقم 0 قمت بوضعه بشكل التالي ولكن اصبح يظهر رسالة خطاء await flutterLocalNotificationsPlugin .show(int.parse(DataOfToday), title, body, platformChannelSpecifics, payload: 'test'); [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: FormatException: Invalid radix-10 number (at character 1) E/flutter (31845): 28-5-2021 E/flutter (31845): ^ E/flutter (31845): E/flutter (31845): #0 int._throwFormatException (dart:core-patch/integers_patch.dart:131:5) E/flutter (31845): #1 int._parseRadix (dart:core-patch/integers_patch.dart:142:16) E/flutter (31845): #2 int._parse (dart:core-patch/integers_patch.dart:100:12) E/flutter (31845): #3 int.parse (dart:core-patch/integers_patch.dart:63:12) اقتباس
1 Wael Aljamal نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 بتاريخ 5 دقائق مضت قال مروان مروان3: قمت بوضعه بشكل التالي ولكن اصبح يظهر رسالة خطاء ربما لأن parse لا يستطيع تحويل date of today المتغير لديك لقيمة رقمية. حاول استخدام المثال الذي أدرجته أنا في التعليق الأول بتاريخ 31 دقائق مضت قال مروان مروان3: new DateTime.now().microsecondsSinceEpoch هذه بشكل كامل كقيمة عددية. 1 اقتباس
0 Flutter Dev نشر 28 مايو 2021 الكاتب أرسل تقرير نشر 28 مايو 2021 بتاريخ 6 دقائق مضت قال Wael Aljamal: ربما لأن parse لا يستطيع تحويل date of today المتغير لديك لقيمة رقمية. حاول استخدام المثال الذي أدرجته أنا في التعليق الأول هذه بشكل كامل كقيمة عددية. اعذرني ولكن قد اكون انا استخدمها بشكل خطاء هل يتم استخدمها بهذا الشكل؟ static Future<void> _demoNotification(String title, String body) async { var ggggg =DateTime.now().millisecondsSinceEpoch; var androidPlatformChannelSpecifics = AndroidNotificationDetails( //'channel_ID', 'channel name', 'channel description', ggggg.toString(), 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, // setAsGroupSummary: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show( ggggg, title, body, platformChannelSpecifics, payload: 'test'); } بتاريخ 17 دقائق مضت قال Wael Aljamal: ربما لأن parse لا يستطيع تحويل date of today المتغير لديك لقيمة رقمية. حاول استخدام المثال الذي أدرجته أنا في التعليق الأول هذه بشكل كامل كقيمة عددية. لقد نجح الامر بشكل التالي ولكن حدثت مشكله ان كل اشعار ياتي الي مرتين يعني دبل او دبلكيت يحدث للاشعار static Future<void> _demoNotification(String title, String body) async { Random random = new Random(); int randomNumber = random.nextInt(100); var androidPlatformChannelSpecifics = AndroidNotificationDetails( //'channel_ID', 'channel name', 'channel description', randomNumber.toString(), 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, // setAsGroupSummary: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show(randomNumber, title, body, platformChannelSpecifics, payload: 'test'); } اقتباس
1 Wael Aljamal نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 بتاريخ 24 دقائق مضت قال مروان مروان3: ان كل اشعار ياتي الي مرتين يعني دبل او دبلكيت يحدث للاشعار لنفس الاشعار يكون له channel_id نفس القيمة نمررها في الحقلين نفس النمط أيضا. 1 اقتباس
0 Flutter Dev نشر 28 مايو 2021 الكاتب أرسل تقرير نشر 28 مايو 2021 بتاريخ 1 دقيقة مضت قال Wael Aljamal: لنفس الاشعار يكون له channel_id نفس القيمة نمررها في الحقلين نفس النمط أيضا. لا اقصد انني ارغب بالحصول على شعارين انا الان احصل على 2 ولنفس الاشعار يعني يحصل ازدواجيه اقتباس
1 Wael Aljamal نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 بتاريخ 3 دقائق مضت قال مروان مروان3: لا اقصد انني ارغب بالحصول على شعارين انا الان احصل على 2 ولنفس الاشعار يعني يحصل ازدواجيه هل يصل إشعارين متطابقين في نفس اللحظة؟ 1 اقتباس
0 Flutter Dev نشر 28 مايو 2021 الكاتب أرسل تقرير نشر 28 مايو 2021 بتاريخ 2 دقائق مضت قال Wael Aljamal: هل يصل إشعارين متطابقين في نفس اللحظة؟ نعم اخي بعد استعمال الكود التالي: الكود هذا حل المشكله الاولى ولكن الان يصل اشعارين متطابقين في نفس اللحظة static Future<void> _demoNotification(String title, String body) async { Random random = new Random(); int randomNumber = random.nextInt(100); var androidPlatformChannelSpecifics = AndroidNotificationDetails( //'channel_ID', 'channel name', 'channel description', randomNumber.toString(), 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, // setAsGroupSummary: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show(randomNumber, title, body, platformChannelSpecifics, payload: 'test'); } اقتباس
1 Wael Aljamal نشر 28 مايو 2021 أرسل تقرير نشر 28 مايو 2021 بتاريخ 2 دقائق مضت قال مروان مروان3: نعم اخي بعد استعمال الكود التالي: الكود هذا حل المشكله الاولى ولكن الان يصل اشعارين متطابقين في نفس اللحظة channel_id تعمل على تجميع الإشعارات مثل سنحاول إبقائها ثابتة لعلى مستوى التطبيق ونغير id في الدالة show فقط: static Future<void> _demoNotification(String title, String body) async { Random random = new Random(); int randomNumber = random.nextInt(100); var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'channel_ID', 'channel name', 'channel description', importance: Importance.max, playSound: true, // sound: 'sound', // sound: true, // setAsGroupSummary: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show(randomNumber, title, body, platformChannelSpecifics, payload: 'test'); } _________ إن لم تحل المشكلة تأكد من قاعدة البيانات لديك هل يتم تكرار الإشعار في البيانات.. 1 اقتباس
0 Flutter Dev نشر 28 مايو 2021 الكاتب أرسل تقرير نشر 28 مايو 2021 (معدل) @Wael Aljamal كل الشكر لك اخي تم حل المشكلتين بفضل الله وفضلك وهذا الكود كامل للفائده: Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { print("Handling a background message: ${message.messageId}"); } class ShowNotifications { static FirebaseMessaging messaging = FirebaseMessaging.instance; static void showNotification(String title, String body) async { await _demoNotification(title, body); } static int i = 0; static Future<void> _demoNotification(String title, String body) async { Random random = new Random(); int randomNumber = random.nextInt(10); var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'channel_ID', 'channel name', 'channel description', importance: Importance.max, playSound: true, showProgress: true, priority: Priority.high, ticker: 'test ticker'); var iOSChannelSpecifics = IOSNotificationDetails(); var platformChannelSpecifics = NotificationDetails( android: androidPlatformChannelSpecifics, iOS: iOSChannelSpecifics); await flutterLocalNotificationsPlugin .show(randomNumber, title, body, platformChannelSpecifics, payload: 'test'); } static FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); static void initialization(){ var initializationSettingsAndroid = new AndroidInitializationSettings('@mipmap/ic_launcher'); var initializationSettingsIOS = new IOSInitializationSettings(); var initializationSettings = new InitializationSettings( android: initializationSettingsAndroid, iOS: initializationSettingsIOS); flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin(); flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification); } static Future onSelectNotification(String payload) async { showDialog( // context: context, builder: (_) { return new AlertDialog( title: Text("PayLoad"), content: Text("Payload : $payload"), ); }, ); } static notification() async { await Firebase.initializeApp();messaging = FirebaseMessaging.instance; FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); NotificationSettings settings = await messaging.requestPermission( alert: true, badge: true, provisional: false, sound: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { print('User granted permission'); FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('Message title: ${message.notification?.title}, body: ${message.notification?.body}, data: ${message.data}'); // Parse the message received PushNotification notification = PushNotification( title: message.notification?.title, body: message.notification?.body, dataTitle: message.data['title'], dataBody: message.data['body'], ); // showNotification(data['title'], data['notification']['body']); if(i%2==0) { showNotification( notification.title, notification.body); }; i++; }); } else { print('User declined or has not accepted permission'); } } } تم التعديل في 28 مايو 2021 بواسطة مروان مروان3 1 اقتباس
السؤال
Flutter Dev
السلام عليكم ورحمة الله وبركاته
تحيه طيبه للجميع
لدي كلاس استقبال من خلاله الاشعارات من FCM الكلاس يعمل جيدا ولكن توجد مشكله واحده وهيا ان كل اشعار ياتيني يحذف الذي سبقه بمعنى لم يتم عرض الا اشعار واحد وهو اخر اشعار في لوحة اشعارات الاندرويد او ما يسمى notification bar
هل يوجد حل لحل هذا المشكله ؟
الكلاس المستعمل كامل
12 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.