1
resposta

Payload Flutter Notifications

Desenvolvi uma aplicação que recebo mensagens via push, porem eu queria passar uma rota através do payload tambem, para que quando eu clico na notificação, eu navegue até uma pagina especifica. Porem estou com dificuldades na hora de fazer este código que "Ouve" o payload, poderiam me ajudar? meu codigo no momento está assim:

Main:

import 'dart:async';

import 'package:fcm/pages/routes.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';

import 'firebase/firebase_configures.dart';
import 'firebase/firebase_options.dart';

Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  await setupFlutterNotifications();
  showFlutterNotification(message);
  print('Manipulando uma mensagem em segundo plano ${message.messageId}');
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  await setupFlutterNotifications();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Exemplo de Mensagens',
      theme: ThemeData.dark(),
      routes: Routes.list,
      initialRoute: Routes.initial,
      navigatorKey: Routes.navigatorKey,
    );
  }
}

Aplicação:

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';

import '../firebase/firebase_configures.dart';
import '../token_monitor.dart';

class Application extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => _Application();
}

class _Application extends State<Application> {
  @override
  void initState() {
    super.initState();

    FirebaseMessaging.onMessage.listen(showFlutterNotification);

    FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
      print('Um novo evento onMessageOpenedApp foi publicado!');
    });
    
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Cloud Messaging'),
      ),
      body: SingleChildScrollView(
        child: Column(
          children: [
            TokenMonitor(),
          ],
        ),
      ),
    );
  }
}

Configurações de mensagem:

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

late AndroidNotificationChannel channel;
bool isFlutterLocalNotificationsInitialized = false;
late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

Future<void> setupFlutterNotifications() async {
  if (isFlutterLocalNotificationsInitialized) {
    return;
  }
  channel = const AndroidNotificationChannel(
    'high_importance_channel',
    'Notificações de Alta Importância',
    description: 'Este canal é usado para notificações importantes.',
    importance: Importance.high,
  );

  flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

  await flutterLocalNotificationsPlugin
      .resolvePlatformSpecificImplementation<
          AndroidFlutterLocalNotificationsPlugin>()
      ?.createNotificationChannel(channel);

  await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
    alert: true,
    badge: true,
    sound: true,
  );
  isFlutterLocalNotificationsInitialized = true;
}

void showFlutterNotification(RemoteMessage message) {
  final payload = message.data;
  RemoteNotification? notification = message.notification;
  AndroidNotification? android = message.notification?.android;
  if (notification != null && android != null) {
    flutterLocalNotificationsPlugin.show(
      notification.hashCode,
      notification.title,
      notification.body,
      NotificationDetails(
        android: AndroidNotificationDetails(
          channel.id,
          channel.name,
          channelDescription: channel.description,
          icon: 'launch_background',
          
        ),
      ),
    );
  }
}


1 resposta

Olá, Victor! Entendo que você está tentando navegar para uma rota específica ao clicar em uma notificação push. No Flutter, isso pode ser alcançado usando o método onMessageOpenedApp do FirebaseMessaging.

No seu caso, você pode modificar o método onMessageOpenedApp para algo como isto:

FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
   print('Um novo evento onMessageOpenedApp foi publicado!');
   Navigator.pushNamed(context, message.data["rota"]);
});

Neste exemplo, estou assumindo que o payload da sua mensagem tem um campo chamado "rota" que contém o nome da rota para a qual você deseja navegar. Lembre-se de que o nome da rota deve corresponder a uma das rotas que você definiu em Routes.list no seu aplicativo.

Por favor, note que este código deve ser colocado em um lugar onde o context do widget está disponível. Se o context não estiver disponível onde você está chamando Navigator.pushNamed, você pode encontrar erros.

Espero ter ajudado e bons estudos!