Push Notification in APP!

Receive notifications even when the app is in the foreground!
With FlutterFlow, you can implement a Custom Action that converts background notifications into local notifications displayed directly in the app when it is open. This ensures your users never miss an important message, whether the app is in the foreground or background. Provide a more connected experience in your application!
Video on youtube portuguease_BR
https://youtu.be/ynuW8_o-vzE?si=-XAijgRC7DGp4O4y
Video on youtube in English soon.

Here´s the code

inApp Notification.pdf
39.27KB
 // Automatic FlutterFlow imports
import '/backend/backend.dart';
import '/flutter_flow/flutter_flow_theme.dart';
import '/flutter_flow/flutter_flow_util.dart';
import '/custom_code/actions/index.dart'; // Imports other custom actions
import '/flutter_flow/custom_functions.dart'; // Imports custom functions
import 'package:flutter/material.dart';
// Begin custom action code
// DO NOT REMOVE OR MODIFY THE CODE ABOVE!

import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:firebase_messaging/firebase_messaging.dart';

final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
    FlutterLocalNotificationsPlugin();

bool isNotificationInitialized = false;

Future<void> setupFirebaseMessaging2(BuildContext context) async {
  if (!isNotificationInitialized) {
    await _initializeNotifications(); // Inicializa as notificações
    isNotificationInitialized = true;
  }

  // Solicitar permissões para notificações (iOS e Android)
  await FirebaseMessaging.instance.requestPermission(
    alert: true,
    badge: true,
    sound: true,
  );

  // Escutando mensagens em primeiro plano
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    final title = message.notification?.title ?? 'Título padrão';
    final body = message.notification?.body ?? 'Mensagem padrão';

    print('Mensagem recebida no primeiro plano: $title - $body');

    // Exibir notificação enquanto o app está ativo
    showForegroundNotification(title, body);
  });

  // Configurar mensagens em segundo plano
  FirebaseMessaging.onBackgroundMessage(_firebaseBackgroundMessageHandler);
}

Future<void> _initializeNotifications() async {
  // Configurações de inicialização para Android
  const AndroidInitializationSettings initializationSettingsAndroid =
      AndroidInitializationSettings('@mipmap/ic_launcher');

  const InitializationSettings initializationSettings =
      InitializationSettings(android: initializationSettingsAndroid);

  // Inicializar o plugin
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);

  // Criar canal de notificações para Android com som habilitado
  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'high_importance_channel', // ID único do canal
    'Notificações Importantes', // Nome do canal visível ao usuário
    description: 'Este canal é usado para notificações importantes.',
    importance: Importance.max,
    playSound: true, // Som habilitado
  );

  // Registrar o canal no Android
  final androidImplementation =
      flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>();
  await androidImplementation?.createNotificationChannel(channel);
}

Future<void> _firebaseBackgroundMessageHandler(RemoteMessage message) async {
  final title = message.notification?.title ?? 'Título padrão';
  final body = message.notification?.body ?? 'Mensagem padrão';

  print('Mensagem recebida no segundo plano: $title - $body');

  await showForegroundNotification(title, body);
}

Future<void> showForegroundNotification(String title, String body) async {
  try {
    // Geração de ID único para notificações
    final notificationId =
        DateTime.now().millisecondsSinceEpoch.remainder(1000);

    // Configurações da notificação para Android
    const AndroidNotificationDetails androidPlatformChannelSpecifics =
        AndroidNotificationDetails(
      'high_importance_channel', // ID do canal deve ser o mesmo criado
      'Notificações Importantes', // Nome do canal
      channelDescription: 'Este canal é usado para notificações importantes.',
      importance: Importance.max,
      priority: Priority.high,
      playSound: true, // Habilita som
    );

    const NotificationDetails platformChannelSpecifics =
        NotificationDetails(android: androidPlatformChannelSpecifics);

    // Exibe a notificação
    await flutterLocalNotificationsPlugin.show(
      notificationId, // ID único
      title,
      body,
      platformChannelSpecifics,
    );

    print("Notificação exibida com sucesso: $notificationId");
  } catch (e) {
    print('Erro ao exibir a notificação: $e');
  }
}


12
7 replies