auto_route_library
auto_route_library copied to clipboard
Back button on Android always closes the app
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 = [];
}
Removing android:enableOnBackInvokedCallback="true"
from my <application>
tag in AndroidManifest.xml
fixed the problem.