deep link from dead app
All checks were successful
Build and Release FLUX (Multi-Platform) / build-android (push) Successful in 2m41s
Build and Release FLUX (Multi-Platform) / build-web (push) Successful in 1m12s
Build and Release FLUX (Multi-Platform) / build-windows (push) Successful in 7m58s

This commit is contained in:
2026-06-01 10:08:44 +02:00
parent d989b14967
commit 88b1a618bd
5 changed files with 23 additions and 9 deletions

View File

@@ -69,6 +69,7 @@ class AppRouter {
// 1. CREIAMO LA CHIAVE GLOBALE DEL NAVIGATORE // 1. CREIAMO LA CHIAVE GLOBALE DEL NAVIGATORE
static final GlobalKey<NavigatorState> rootNavigatorKey = static final GlobalKey<NavigatorState> rootNavigatorKey =
GlobalKey<NavigatorState>(); GlobalKey<NavigatorState>();
static String? pendingRoute;
static GoRouter createRouter(SessionCubit sessionCubit) { static GoRouter createRouter(SessionCubit sessionCubit) {
return GoRouter( return GoRouter(
navigatorKey: rootNavigatorKey, navigatorKey: rootNavigatorKey,

View File

@@ -17,20 +17,20 @@ Future<void> setupInteractedMessage() async {
} }
void _handleNotificationTap(RemoteMessage message) { void _handleNotificationTap(RemoteMessage message) {
// Verifichiamo che tipo di notifica è e prendiamo l'ID
final eventType = message.data['eventType']; final eventType = message.data['eventType'];
final referenceId = message.data['referenceId']; final referenceId = message.data['referenceId'];
if (eventType == 'task_assigned' && referenceId != null) { if (eventType == 'task_assigned' && referenceId != null) {
// Navighiamo verso il form del Task usando la GlobalKey! final routePath = '/tasks/form/$referenceId';
// Assicuriamoci che il context sia disponibile
final context = AppRouter.rootNavigatorKey.currentContext; final context = AppRouter.rootNavigatorKey.currentContext;
if (context != null) { if (context != null) {
// Usiamo .push perché è una rotta di dettaglio fuori dalla shell // Scenario A: App già aperta, naviga all'istante
// Il path è /tasks/form/:id (vedi il tuo AppRouter) context.push(routePath);
context.push('/tasks/form/$referenceId');
} else { } else {
debugPrint("Attenzione: Context non trovato per il Deep Link!"); // Scenario B: App chiusa. Il contesto non c'è ancora, congeliamo la rotta!
debugPrint("App in fase di avvio. Congelo la rotta: $routePath");
AppRouter.pendingRoute = routePath;
} }
} }
} }

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flux/core/blocs/session/session_cubit.dart'; import 'package:flux/core/blocs/session/session_cubit.dart';
import 'package:flux/core/routes/app_router.dart';
import 'package:flux/core/routes/routes.dart'; import 'package:flux/core/routes/routes.dart';
import 'package:flux/core/theme/theme.dart'; import 'package:flux/core/theme/theme.dart';
import 'package:flux/core/utils/extensions.dart'; import 'package:flux/core/utils/extensions.dart';
@@ -35,6 +36,18 @@ class _HomeScreenState extends State<HomeScreen> {
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
if (AppRouter.pendingRoute != null) {
final destination = AppRouter.pendingRoute!;
// ⚠️ Svuota IMMEDIATAMENTE la variabile per evitare loop infiniti se si ruota lo schermo!
AppRouter.pendingRoute = null;
// Spedisci l'utente al task!
context.push(destination);
}
});
// Inizializziamo il sensore del ciclo di vita // Inizializziamo il sensore del ciclo di vita
_lifecycleListener = AppLifecycleListener( _lifecycleListener = AppLifecycleListener(
onPause: () { onPause: () {

View File

@@ -90,7 +90,7 @@ class _StaffScreenState extends State<StaffScreen> {
return ListView.separated( return ListView.separated(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
itemCount: list.length, itemCount: list.length,
separatorBuilder: (_, _) => const SizedBox(height: 12), separatorBuilder: (_, _) => const SizedBox(height: 6),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return _buildStaffCard(list[index]); return _buildStaffCard(list[index]);
}, },

View File

@@ -1,7 +1,7 @@
name: flux name: flux
description: "Gestione attività negozio di telefonia" description: "Gestione attività negozio di telefonia"
publish_to: 'none' publish_to: 'none'
version: 1.1.7+25 version: 1.1.8+26
environment: environment:
sdk: ^3.11.3 sdk: ^3.11.3