Milad-Akarie / auto_route_library

Flutter route generator
MIT License
1.51k stars 381 forks source link

Back button on Android always closes the app #1788

Open rignaneseleo opened 7 months ago

rignaneseleo commented 7 months ago

Hi, I'm on version 7.8.4 and I'm having a problem with navigation on Android 14: when I press the phone back button on any page of the app, it closes instead of executing the pop() function. The onWillPop functions are never triggered.

I read #1391 and tried to manually set the backButtonDispatcher to ChildBackButtonDispatcher( Router.of(context).backButtonDispatcher!) but the app crashes with error "Router operation requested with a context that does not include a Router."

This is my app.dart:

import 'package:auto_route/auto_route.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_translate/flutter_translate.dart';
import 'package:parenthood/router/router.dart';
import 'package:parenthood/router/router_provider.dart';
import 'package:parenthood/theme/theme_definition.dart';

class App extends StatefulWidget {
  const App({Key? key}) : super(key: key);

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    var localizationDelegate = LocalizedApp.of(context).delegate;

    return LocalizationProvider(
      state: LocalizationProvider.of(context).state,
      child: Consumer(
        builder: (context, ref, child) {
          final appRouter = ref.watch(routerProvider);

          return MaterialApp.router(
            key: Key(localizationDelegate.currentLocale.languageCode),
            theme: defaultTheme(),
            debugShowCheckedModeBanner: false,
            title: translate("brand"),
            routerDelegate: AutoRouterDelegate(
              appRouter,
              navigatorObservers: () => [
                FirebaseAnalyticsObserver(analytics: FirebaseAnalytics.instance)
              ],
            ),
            routeInformationParser: appRouter.defaultRouteParser(),
            supportedLocales: localizationDelegate.supportedLocales,
            locale: localizationDelegate.currentLocale,
            localizationsDelegates: [
              localizationDelegate,
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
              GlobalCupertinoLocalizations.delegate,
            ],
          );
        },
      ),
    );
  }
}

Here is my router.dart:

import 'package:auto_route/auto_route.dart';
import 'package:parenthood/router/router.gr.dart';

import 'guards/auth_guard.dart';
import 'guards/online_guard.dart';
import 'guards/startup_guard.dart';

@AutoRouterConfig()
class AppRouter extends $AppRouter {
  AppRouter({
    required AuthGuard authGuard,
    required StartupGuard startupGuard,
    required OnlineGuard onlineGuard,
  }) : super() {
    routes.addAll([
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 600,
        page: WelcomeRoute.page,
        initial: true,
        guards: [startupGuard],
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OfflineRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: LoginRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: ForgotPasswordRoute.page,
      ),
      //SIGN UP
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: SignupIntroRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: EmailSignupRoute.page,
      ),
      //ONBOARDING
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OnboardingNameStepRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OnboardingParentTypeStepRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OnboardingReasonsStepRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OnboardingPrivacyStepRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OnboardingNotificationPromptRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: OnboardingFreeWeekPromptRoute.page,
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: PremiumRoute.page,
      ),
      //FUN
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: FunFeedRoute.page,
        path: '/fun',
        guards: [onlineGuard],
      ),
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: CoparentFunFeedRoute.page,
        path: '/coparent-fun',
        guards: [onlineGuard],
      ),
      //AUTHORIZED
      CustomRoute(
        transitionsBuilder: TransitionsBuilders.fadeIn,
        durationInMilliseconds: 200,
        page: AuthorizedRoute.page,
        guards: [authGuard],
        children: [
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: HomeRoute.page,
            initial: true,
            path: 'home',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: HomeWidgetPromoteRoute.page,
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: HomeWidgetInstructionsIosRoute.page,
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: HomeWidgetInstructionsAndroidRoute.page,
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: ActivityRoute.page,
            path: 'activity',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: AccountSettingsRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: WidgetGuideRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: JournalRoute.page,
            path: 'journal',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: ActivitiesRoute.page,
            path: 'activities',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: TroubleShooterRoute.page,
            path: 'troubleshooters',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: TroubleshooterCardsListRoute.page,
            path: 'troubleshooter-cards',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: TroubleshooterCardDetailsRoute.page,
            path: 'troubleshooter-card-details',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: ManageActivityRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: QuestionOfDayRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: ConversationsRoute.page,
            path: 'conversations',
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: FavoriteConversationsRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: AllNotesRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: ConversationNotesRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: NoteRoute.page,
            guards: [onlineGuard],
          ),
          CustomRoute(
            transitionsBuilder: TransitionsBuilders.fadeIn,
            durationInMilliseconds: 200,
            page: NotifQuestionOfDayRoute.page,
            guards: [onlineGuard],
          ),
        ],
      ),
    ]);
  }

  @override
  RouteType get defaultRouteType => const RouteType.cupertino();

  @override
  final List<AutoRoute> routes = [];
}
rignaneseleo commented 7 months ago

Removing android:enableOnBackInvokedCallback="true" from my <application> tag in AndroidManifest.xml fixed the problem.

shubhanus commented 1 month ago

for me this didn't work i had to use back_button_interceptor and then somewhere in root from appRouter get the current context in interceptor context

bool _routeInterceptor(stopDefaultButtonEvent, info) {
    var navigationState =
        Navigator.of(widget.appRouter.navigatorKey.currentContext!);
    if (navigationState.canPop()) {
      navigationState.pop();
      return true;
    }
    return false;
  }