fix onDidReceiveNotificationResponse

This commit is contained in:
Jonatas Antunes Messias 2024-06-18 09:25:23 -03:00
parent 691612a723
commit e5b2edb670
7 changed files with 234 additions and 212 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,109 +0,0 @@
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'dart:convert';
import 'dart:io' show Platform;
class PushNotificationService {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
final FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
static const String _channelId = 'visitRequest';
static const String _channelName = 'Visitas';
static const String _channelDescription = 'Solicitação de visita';
Future<void> initialize() async {
var initializationSettingsAndroid =
const AndroidInitializationSettings('ic_launcher');
var initializationSettingsIOS = const DarwinInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
);
var initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsIOS,
);
await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
if (Platform.isAndroid) {
var channel = const AndroidNotificationChannel(
_channelId,
_channelName,
description: _channelDescription,
importance: Importance.high,
);
await _flutterLocalNotificationsPlugin
.resolvePlatformSpecificImplementation<
AndroidFlutterLocalNotificationsPlugin>()
?.createNotificationChannel(channel);
}
await Firebase.initializeApp();
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
FirebaseMessaging.onMessage.listen(_handleMessage);
FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage);
NotificationSettings settings = await _firebaseMessaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
debugPrint('User granted permission: ${settings.authorizationStatus}');
}
void _handleMessage(RemoteMessage message) {
RemoteNotification? notification = message.notification;
AndroidNotification? android = message.notification?.android;
Map<String, dynamic> data = message.data;
// Verifica se um clickAction e se é um visit_request
String? clickAction = data['clickAction'];
if (clickAction != null && clickAction == "visit_request") {
// Implementa a lógica específica para visit_request
// Por exemplo, exibir uma notificação específica para visit_request
if (notification != null && android != null) {
var androidPlatformChannelSpecifics = const AndroidNotificationDetails(
_channelId,
_channelName,
channelDescription: "Descrição específica para visit_request",
importance: Importance.max,
priority: Priority.high,
);
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
);
_flutterLocalNotificationsPlugin.show(
notification.hashCode,
"Título específico para visit_request",
"Corpo específico para visit_request",
platformChannelSpecifics,
payload:
"Dados adicionais que podem ser usados ao tocar na notificação",
);
}
} else if (notification != null && android != null) {
// Trata outras notificações como normalmente
var androidPlatformChannelSpecifics = const AndroidNotificationDetails(
_channelId,
_channelName,
channelDescription: _channelDescription,
importance: Importance.max,
priority: Priority.high,
);
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
);
_flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
platformChannelSpecifics,
);
}
}
Future<void> _firebaseMessagingBackgroundHandler(
RemoteMessage message) async {
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
}

View File

@ -0,0 +1,158 @@
import 'package:flutter/material.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:f_r_e_hub/components/templates_components/visit_request_template_component/visit_request_template_component_widget.dart';
import 'dart:io' show Platform;
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
class PushNotificationService {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
Function(BuildContext)? onNotificationClick;
/// Inicializa o serviço de notificação push.
Future<void> initialize() async {
FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin =
FlutterLocalNotificationsPlugin();
await _requestPermissions();
_configureLocalNotification(_flutterLocalNotificationsPlugin);
_listenToForegroundMessages(_flutterLocalNotificationsPlugin);
_handleMessageTap();
_listenToBackgroundMessages();
await _updateDeviceToken();
}
void showCustomSheet(BuildContext context) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (BuildContext context) {
return const VisitRequestTemplateComponentWidget(
name: '', // Supondo que esses valores serão extraídos da mensagem
image: '',
message: '',
reason: '',
);
},
);
}
void _configureLocalNotification(
FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin) {
var initializationSettingsAndroid =
const AndroidInitializationSettings('mipmap/ic_launcher');
var initializationSettingsIOS = const DarwinInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
);
var initializationSettings = InitializationSettings(
android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
_flutterLocalNotificationsPlugin.initialize(initializationSettings,
onDidReceiveNotificationResponse: (response) async {
debugPrint('Notification tapped!');
});
}
/// Solicita permissões ao usuário para iOS.
Future<void> _requestPermissions() async {
NotificationSettings settings = await _firebaseMessaging.requestPermission(
alert: true,
badge: true,
sound: true,
);
if (settings.authorizationStatus == AuthorizationStatus.authorized) {
debugPrint('User granted permission');
} else {
debugPrint('User declined or has not accepted permission');
}
}
void _listenToForegroundMessages(
FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin) {
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
debugPrint('Got a message whilst in the foreground!');
debugPrint('Message data: ${message.data}');
RemoteNotification? notification = message.notification;
AndroidNotification? android = message.notification?.android;
if (notification != null && android != null) {
_flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
const NotificationDetails(
android: AndroidNotificationDetails(
'your_channel_id',
'Your Channel Name',
channelDescription: 'Your Channel Description',
importance: Importance.max,
priority: Priority.high,
icon: 'mipmap/ic_launcher',
),
),
);
}
});
}
/// Configura a ação ao tocar na notificação.
void _handleMessageTap() {
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
debugPrint('Message clicked!');
// Implementar ação ao tocar na notificação
});
}
/// Configura o ouvinte para mensagens em segundo plano.
void _listenToBackgroundMessages() {
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
}
/// Atualiza o token do dispositivo e envia para o servidor, se necessário.
Future<void> _updateDeviceToken() async {
String? token = await _firebaseMessaging.getToken();
debugPrint('Push Messaging token: $token');
// Enviar token para o servidor
}
}
/// Manipula mensagens recebidas em segundo plano.
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
debugPrint('Handling a background message: ${message.messageId}');
}
void _handleNotificationTap(
NotificationResponse response, BuildContext context) {
// Implementação para lidar com o toque na notificação
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (BuildContext context) {
return const VisitRequestTemplateComponentWidget(
name: '', // Supondo que esses valores serão extraídos da mensagem
image: '',
message: '',
reason: '',
);
},
);
}
void _handleMessageOpenedApp(RemoteMessage message, BuildContext context) {
// Mostra um modal ao invés de navegar para uma nova página
showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (BuildContext context) {
return const VisitRequestTemplateComponentWidget(
name: '', // Supondo que esses valores serão extraídos da mensagem
image: '',
message: '',
reason: '',
);
},
);
}

View File

@ -295,7 +295,8 @@ class _VisitRequestTemplateComponentWidgetState
.addToEnd(const SizedBox(width: 10.0)), .addToEnd(const SizedBox(width: 10.0)),
), ),
Padding( Padding(
padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0), padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0),
child: TextFormField( child: TextFormField(
controller: _model.textController3, controller: _model.textController3,
focusNode: _model.textFieldFocusNode3, focusNode: _model.textFieldFocusNode3,
@ -373,7 +374,8 @@ class _VisitRequestTemplateComponentWidgetState
), ),
), ),
Padding( Padding(
padding: const EdgeInsetsDirectional.fromSTEB(24.0, 0.0, 24.0, 0.0), padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0),
child: TextFormField( child: TextFormField(
controller: _model.textController4, controller: _model.textController4,
focusNode: _model.textFieldFocusNode4, focusNode: _model.textFieldFocusNode4,
@ -464,8 +466,8 @@ class _VisitRequestTemplateComponentWidgetState
height: 40.0, height: 40.0,
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0), 24.0, 0.0, 24.0, 0.0),
iconPadding: iconPadding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), 0.0, 0.0, 0.0, 0.0),
color: FlutterFlowTheme.of(context).success, color: FlutterFlowTheme.of(context).success,
textStyle: FlutterFlowTheme.of(context) textStyle: FlutterFlowTheme.of(context)
.titleSmall .titleSmall
@ -498,8 +500,8 @@ class _VisitRequestTemplateComponentWidgetState
height: 40.0, height: 40.0,
padding: const EdgeInsetsDirectional.fromSTEB( padding: const EdgeInsetsDirectional.fromSTEB(
24.0, 0.0, 24.0, 0.0), 24.0, 0.0, 24.0, 0.0),
iconPadding: iconPadding: const EdgeInsetsDirectional.fromSTEB(
const EdgeInsetsDirectional.fromSTEB(0.0, 0.0, 0.0, 0.0), 0.0, 0.0, 0.0, 0.0),
color: FlutterFlowTheme.of(context).error, color: FlutterFlowTheme.of(context).error,
textStyle: FlutterFlowTheme.of(context) textStyle: FlutterFlowTheme.of(context)
.titleSmall .titleSmall

View File

@ -32,17 +32,17 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
initialLocation: '/', initialLocation: '/',
debugLogDiagnostics: true, debugLogDiagnostics: true,
refreshListenable: appStateNotifier, refreshListenable: appStateNotifier,
errorBuilder: (context, state) => appStateNotifier.showSplashImage // errorBuilder: (context, state) => appStateNotifier.showSplashImage
? Builder( // ? Builder(
builder: (context) => Container( // builder: (context) => Container(
color: FlutterFlowTheme.of(context).primary, // color: FlutterFlowTheme.of(context).primary,
child: Image.asset( // child: Image.asset(
'assets/images/logo.svg', // 'assets/images/logo.svg',
fit: BoxFit.cover, // fit: BoxFit.cover,
), // ),
), // ),
) // )
: const PeopleOnThePropertyPageWidget(), // : const PeopleOnThePropertyPageWidget(),
routes: [ routes: [
// FFRoute( // FFRoute(
// name: '_initialize', // name: '_initialize',
@ -61,28 +61,8 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
// ), // ),
FFRoute( FFRoute(
name: '_initialize', name: '_initialize',
path: '/onBoardingPage', path: '/',
builder: (context, params) => LoginPageWidget( builder: (context, _) => const OnBoardingPageWidget(),
device: params.getParam(
'device',
ParamType.String,
),
),
),
FFRoute(
name: 'LoginPage',
path: '/loginPage',
builder: (context, params) => LoginPageWidget(
device: params.getParam(
'device',
ParamType.String,
),
),
),
FFRoute(
name: 'ForgotPasswordPage',
path: '/forgotPasswordPage',
builder: (context, params) => const ForgotPasswordPageWidget(),
), ),
FFRoute( FFRoute(
name: 'homePage', name: 'homePage',
@ -153,7 +133,7 @@ GoRouter createRouter(AppStateNotifier appStateNotifier) => GoRouter(
name: 'peopleOnThePropertyPage', name: 'peopleOnThePropertyPage',
path: '/peopleOnThePropertyPage', path: '/peopleOnThePropertyPage',
builder: (context, params) => const PeopleOnThePropertyPageWidget(), builder: (context, params) => const PeopleOnThePropertyPageWidget(),
) ),
].map((r) => r.toRoute(appStateNotifier)).toList(), ].map((r) => r.toRoute(appStateNotifier)).toList(),
); );

View File

@ -1,4 +1,6 @@
import 'package:f_r_e_hub/backend/api_requests/api_calls.dart'; import 'package:f_r_e_hub/backend/api_requests/api_calls.dart';
import 'package:f_r_e_hub/backend/push_notification/pushNotificationService.dart';
import 'package:f_r_e_hub/components/templates_components/visit_request_template_component/visit_request_template_component_widget.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart';
@ -12,74 +14,27 @@ import 'flutter_flow/flutter_flow_util.dart';
import 'flutter_flow/internationalization.dart'; import 'flutter_flow/internationalization.dart';
import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_analytics/firebase_analytics.dart';
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform); await initializeApp();
FirebaseAnalytics analyticsInstance = FirebaseAnalytics.instance;
analyticsInstance.logEvent(
name: 'test_event',
parameters: <String, Object>{
'string': 'test',
'int': 42,
'long': 12345678910,
'double': 42.0,
'boolAsString': true.toString(),
},
);
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
var initializationSettingsAndroid =
const AndroidInitializationSettings('mipmap/ic_launcher');
var initializationSettingsIOS = const DarwinInitializationSettings(
requestAlertPermission: true,
requestBadgePermission: true,
requestSoundPermission: true,
);
var initializationSettings = InitializationSettings(
android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
await _flutterLocalNotificationsPlugin.initialize(initializationSettings);
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
RemoteNotification? notification = message.notification;
AndroidNotification? android = message.notification?.android;
if (notification != null && android != null) {
_flutterLocalNotificationsPlugin.show(
notification.hashCode,
notification.title,
notification.body,
const NotificationDetails(
android: AndroidNotificationDetails(
'visitRequest',
'Visitas',
channelDescription: 'Solicitação de visita',
importance: Importance.max,
priority: Priority.high,
icon: 'mipmap/ic_launcher',
),
),
);
}
});
GoRouter.optionURLReflectsImperativeAPIs = true;
usePathUrlStrategy();
await FlutterFlowTheme.initialize();
await FFLocalizations.initialize();
final appState = FFAppState();
await appState.initializePersistedState();
runApp(ChangeNotifierProvider( runApp(ChangeNotifierProvider(
create: (context) => appState, create: (context) => FFAppState(),
child: const MyApp(), child: const MyApp(),
)); ));
} }
// Inicialização do plugin de notificações locais Future<void> initializeApp() async {
FlutterLocalNotificationsPlugin _flutterLocalNotificationsPlugin = await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
FlutterLocalNotificationsPlugin(); await FlutterFlowTheme.initialize();
await FFLocalizations.initialize();
// Manipulador de mensagens em segundo plano final appState = FFAppState();
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { await appState.initializePersistedState();
// Certifique-se de inicializar o Firebase dentro do manipulador GoRouter.optionURLReflectsImperativeAPIs = true;
await Firebase.initializeApp(); usePathUrlStrategy();
print("Handling a background message: ${message.messageId}"); final pushNotificationService = PushNotificationService();
await pushNotificationService.initialize();
} }
class MyApp extends StatefulWidget { class MyApp extends StatefulWidget {

View File

@ -1,4 +1,6 @@
import 'package:f_r_e_hub/backend/push_notification/pushNotification.dart'; // import 'package:f_r_e_hub/backend/push_notification/pushNotification.dart';
import 'package:f_r_e_hub/backend/push_notification/pushNotificationService.dart';
import 'package:f_r_e_hub/components/templates_components/visit_request_template_component/visit_request_template_component_widget.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import '/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart'; import '/components/organism_components/bottom_arrow_linked_locals_component/bottom_arrow_linked_locals_component_widget.dart';
@ -33,8 +35,42 @@ class _HomePageWidgetState extends State<HomePageWidget> {
super.initState(); super.initState();
_model = createModel(context, () => HomePageModel()); _model = createModel(context, () => HomePageModel());
// PushNotificationService().onNotificationClick = (context) {
// showModalBottomSheet(
// context: context,
// isScrollControlled: true,
// builder: (BuildContext context) {
// return const VisitRequestTemplateComponentWidget(
// name: '', // Supondo que esses valores serão extraídos da mensagem
// image: '',
// message: '',
// reason: '',
// );
// },
// );
// };
// On page load action. // On page load action.
SchedulerBinding.instance.addPostFrameCallback((_) async { SchedulerBinding.instance.addPostFrameCallback((_) async {
FirebaseMessaging.onMessageOpenedApp.listen((message) {
debugPrint('onMessageOpenedApp Test');
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
backgroundColor:
Colors.transparent, // Faz o fundo do Dialog ser transparente
child: VisitRequestTemplateComponentWidget(
name: 'Nome Exemplo',
reason: 'Motivo Exemplo',
message: 'Mensagem Exemplo',
image: 'URL da Imagem',
),
);
},
);
});
if (FFAppState().cliUUID == '') { if (FFAppState().cliUUID == '') {
showModalBottomSheet( showModalBottomSheet(
isScrollControlled: true, isScrollControlled: true,