diff --git a/packages/flutter/lib/src/widgets/router.dart b/packages/flutter/lib/src/widgets/router.dart index aca00821c2..e0aff33518 100644 --- a/packages/flutter/lib/src/widgets/router.dart +++ b/packages/flutter/lib/src/widgets/router.dart @@ -1052,6 +1052,7 @@ class _BackButtonListenerState extends State { if (oldWidget.onBackButtonPressed != widget.onBackButtonPressed) { dispatcher?.removeCallback(oldWidget.onBackButtonPressed); dispatcher?.addCallback(widget.onBackButtonPressed); + dispatcher?.takePriority(); } super.didUpdateWidget(oldWidget); } diff --git a/packages/flutter/test/widgets/router_test.dart b/packages/flutter/test/widgets/router_test.dart index 55532a9e54..ca949a27bf 100644 --- a/packages/flutter/test/widgets/router_test.dart +++ b/packages/flutter/test/widgets/router_test.dart @@ -1032,6 +1032,64 @@ testWidgets('ChildBackButtonDispatcher take priority recursively', (WidgetTester await tester.pump(); expect(find.text('popped inner1'), findsOneWidget); }); + + testWidgets('`didUpdateWidget` test', (WidgetTester tester) async { + final SimpleRouteInformationProvider provider = SimpleRouteInformationProvider(); + provider.value = const RouteInformation( + location: 'initial', + ); + final BackButtonDispatcher outerDispatcher = RootBackButtonDispatcher(); + late StateSetter setState; + String location = 'first callback'; + final SimpleRouterDelegate routerDelegate = SimpleRouterDelegate() + ..builder = (BuildContext context, RouteInformation? information) { + // Creates the sub-router. + return Column( + children: [ + Text(information!.location!), + StatefulBuilder( + builder: (BuildContext context, StateSetter setter) { + setState = setter; + return BackButtonListener( + child: Container(), + onBackButtonPressed: () { + provider.value = RouteInformation( + location: location, + ); + return SynchronousFuture(true); + }, + ); + }, + ), + ], + ); + } + ..onPopRoute = () { + provider.value = const RouteInformation( + location: 'popped outter', + ); + return SynchronousFuture(true); + }; + + await tester.pumpWidget(buildBoilerPlate( + Router( + backButtonDispatcher: outerDispatcher, + routeInformationProvider: provider, + routeInformationParser: SimpleRouteInformationParser(), + routerDelegate: routerDelegate + ) + )); + + // Only update BackButtonListener widget. + setState((){ + location = 'second callback'; + }); + + await tester.pump(); + await outerDispatcher.invokeCallback(SynchronousFuture(false)); + await tester.pump(); + expect(find.text('second callback'), findsOneWidget); + }); } Widget buildBoilerPlate(Widget child) {