اذهب إلى المحتوى
  • 0

كيفية الاحتفاظ بأكثر من إشعار في notification bar Flutter

Flutter Dev

السؤال

السلام عليكم ورحمة الله وبركاته

تحيه طيبه للجميع

لدي كلاس استقبال من خلاله الاشعارات من 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');
    }
  }


}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

@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');
    }
  }






}

 

تم التعديل في بواسطة مروان مروان3
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1

حاول إعطاء رقم فريد لكل إشعار، مثل المعرف الخاص به لا تجعله نص ثابت لأنه سوف يتم استبدال الإشعار الحالي بالإشعار الجديد الذي له نفس المعرًف.

حاول وضع قيمة متغيرة مثل نص متغير أو قيمة الوقت الفعلي أو قيمة عشوائية وهذا سيعمل على الحفاظ على كل الإشعارات.

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
بتاريخ 3 دقائق مضت قال مروان مروان3:

قمت بتجربه بشكل التالي ووضع الوقت وتاريخ وثواني حتى يتم الفرق ولكن مع الاسف المشكله ما زالت مستمره 

عفوا علينا تعديل هذه أيضا:

await flutterLocalNotificationsPlugin
        .show(0, title, body, platformChannelSpecifics, payload: 'test');

استبدل الرقم 0

يتم تجميع الإشعارات حسب channel_id التي يتم تمريرها في الدالة التالية. لذلك وجب بناء قناة للإشعارات و توجيه الإشعار الجديد لها.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 5 دقائق مضت قال مروان مروان3:

قمت بوضعه بشكل التالي ولكن اصبح يظهر رسالة خطاء 

ربما لأن parse لا يستطيع تحويل date of today المتغير لديك لقيمة رقمية.

حاول استخدام المثال الذي أدرجته أنا في التعليق الأول

بتاريخ 31 دقائق مضت قال مروان مروان3:

new DateTime.now().microsecondsSinceEpoch

هذه بشكل كامل كقيمة عددية.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 24 دقائق مضت قال مروان مروان3:

ان كل اشعار ياتي الي مرتين يعني دبل او دبلكيت يحدث للاشعار

لنفس الاشعار يكون له channel_id نفس القيمة نمررها في الحقلين نفس النمط أيضا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 3 دقائق مضت قال مروان مروان3:

لا اقصد انني ارغب بالحصول على شعارين انا الان احصل على 2 ولنفس الاشعار يعني يحصل ازدواجيه 

هل يصل إشعارين متطابقين في نفس اللحظة؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 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');
  }

_________

إن لم تحل المشكلة تأكد من قاعدة البيانات لديك هل يتم تكرار الإشعار في البيانات..

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 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');
  }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 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)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 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');
  }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Wael Aljamal:

لنفس الاشعار يكون له channel_id نفس القيمة نمررها في الحقلين نفس النمط أيضا.

لا اقصد انني ارغب بالحصول على شعارين انا الان احصل على 2 ولنفس الاشعار يعني يحصل ازدواجيه 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 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');
  }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...