最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

flutter - How to add an image to title via flutter_local_notifications - Stack Overflow

programmeradmin4浏览0评论

I'm facing a problem adding an image to the username in my app's notifications. I honestly tried to figure it out, but couldn’t find any information. I would be very grateful for your help.

enter image description here (The black circles are where the avatar should be.)

Future<void> showSenderAvatarNotification(RemoteMessage message) async {
  try {
    final data = message.data;
    final senderPhotoUrl = data['senderPhotoUrl'] ?? '';
    final senderName = data['senderName'] ?? 'Неизвестный';
    final messageText = data['messageText'] ?? '';
    final chatId = data['chatId'] ?? 'default_chat';

    final String groupKeyIndividual = 'chat_${chatId}_$senderName';
    final int notificationId = groupKeyIndividual.hashCode;

    Uint8List? avatarBytes;
    if (senderPhotoUrl.isNotEmpty) {
      try {
        final response = await http.get(Uri.parse(senderPhotoUrl));
        if (response.statusCode == 200) {
          final Uint8List downloadedBytes = response.bodyBytes;
          avatarBytes = await cropImageToCircle(downloadedBytes, size: 200);
        } else {
          print('Ошибка загрузки фото. Код ответа: ${response.statusCode}');
        }
      } catch (e) {
        print('Ошибка при загрузке фото: $e');
      }
    }
    if (avatarBytes == null) {
      final Uint8List generatedBytes = await generateInitialLetterAvatar(
          senderName.isNotEmpty ? senderName[0] : '?');
      avatarBytes = await cropImageToCircle(generatedBytes, size: 200);
    }

    // Сохраняем аватарку в файл
    final String avatarFilePath =
        await _saveBytesToFile(avatarBytes, 'avatar_${notificationId}.png');

    // Сохраняем аватарку в глобальной мапе для создания коллажа в summary
    final String mapKey = '$chatId#$senderName';
    _chatAvatars[mapKey] = avatarBytes;

    if (!_groupMessagesBySender.containsKey(mapKey)) {
      _groupMessagesBySender[mapKey] = [];
    }
    _groupMessagesBySender[mapKey]!
        .add(MyMessage(messageText, DateTime.now(), MyPerson(name: senderName)));

    // Создаем объект Person для MessagingStyle из пакета fln, используя иконку из файла.
    final fln.Person messagingPerson = fln.Person(
      name: senderName,
      icon: fln.BitmapFilePathAndroidIcon(avatarFilePath),
    );

    // Преобразуем список наших сообщений в объекты fln.Message
    final List<fln.Message> messagingMessages = _groupMessagesBySender[mapKey]!
        .map((myMsg) => fln.Message(
              myMsg.text,
              myMsg.date,
              messagingPerson,
            ))
        .toList();

    // Создаем стиль уведомления MessagingStyleInformation с groupConversation: true,
    // чтобы аватарка отправителя отображалась рядом с заголовком уведомления.
    final fln.StyleInformation messagingStyle =
        fln.MessagingStyleInformation(
      messagingPerson,
      conversationTitle: senderName,
      groupConversation: false,
      messages: messagingMessages,
    );

    final fln.AndroidNotificationDetails individualAndroidDetails =
        fln.AndroidNotificationDetails(
      'chat_channel_id',
      'Chat Notifications',
      groupAlertBehavior: fln.GroupAlertBehavior.all,
      channelDescription: 'Уведомления из чатов',
      importance: fln.Importance.max,
      priority: fln.Priority.high,
      category: fln.AndroidNotificationCategory.message,
      styleInformation: messagingStyle,
      largeIcon: fln.FilePathAndroidBitmap(avatarFilePath),
      icon: '@drawable/ic_notification'
    );
    final fln.NotificationDetails individualDetails =
        fln.NotificationDetails(android: individualAndroidDetails);

    await flutterLocalNotificationsPlugin.show(
      notificationId,
      '',
      messageText,
      individualDetails,
      payload: mapKey,
    );

    // Формирование сводного уведомления (summary) для всех чатов.
    // Создаем составной коллаж из аватарок всех чатов.
    final List<Uint8List> avatars = _chatAvatars.values.toList();
    final Uint8List collageBytes = await createAvatarsCollage(avatars, size: 200);
    final String collagePath = await _saveBytesToFile(collageBytes, 'collage.png');

    final int totalMessages = _groupMessagesBySender.values.fold<int>(
        0, (sum, list) => sum + list.length);
    final int summaryNotificationId = 0;
    final String summaryContent = 'Новые сообщения';
    final String summaryText = 'У вас $totalMessages новых сообщений';

    final fln.AndroidNotificationDetails summaryAndroidDetails =
        fln.AndroidNotificationDetails(
      'chat_channel_id',
      'Chat Notifications',
      channelDescription: 'Сводка уведомлений по чатам',
      importance: fln.Importance.max,
      priority: fln.Priority.high,
      groupKey: 'all_chats',
      category: fln.AndroidNotificationCategory.message,
      setAsGroupSummary: true,
      icon: '@drawable/ic_notification',
      largeIcon: fln.FilePathAndroidBitmap(collagePath),
    );
    final fln.NotificationDetails summaryNotificationDetails =
        fln.NotificationDetails(android: summaryAndroidDetails);

    await flutterLocalNotificationsPlugin.show(
      summaryNotificationId,
      summaryContent,
      summaryText,
      summaryNotificationDetails,
    );
  } catch (e, stack) {
    print('Ошибка при показе уведомления: $e\n$stack');
  }
}

I tried different options in different classes, but never found success.

I set groupConversation = true, but then the avatar was displayed twice (near the title and where it is now)

发布评论

评论列表(0)

  1. 暂无评论