fix a BackButtonListener bug (#80355)

This commit is contained in:
xubaolin 2021-04-15 12:59:02 +08:00 committed by GitHub
parent e7b7ebc066
commit 97fd3ce932
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 0 deletions

View File

@ -1052,6 +1052,7 @@ class _BackButtonListenerState extends State<BackButtonListener> {
if (oldWidget.onBackButtonPressed != widget.onBackButtonPressed) {
dispatcher?.removeCallback(oldWidget.onBackButtonPressed);
dispatcher?.addCallback(widget.onBackButtonPressed);
dispatcher?.takePriority();
}
super.didUpdateWidget(oldWidget);
}

View File

@ -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: <Widget>[
Text(information!.location!),
StatefulBuilder(
builder: (BuildContext context, StateSetter setter) {
setState = setter;
return BackButtonListener(
child: Container(),
onBackButtonPressed: () {
provider.value = RouteInformation(
location: location,
);
return SynchronousFuture<bool>(true);
},
);
},
),
],
);
}
..onPopRoute = () {
provider.value = const RouteInformation(
location: 'popped outter',
);
return SynchronousFuture<bool>(true);
};
await tester.pumpWidget(buildBoilerPlate(
Router<RouteInformation>(
backButtonDispatcher: outerDispatcher,
routeInformationProvider: provider,
routeInformationParser: SimpleRouteInformationParser(),
routerDelegate: routerDelegate
)
));
// Only update BackButtonListener widget.
setState((){
location = 'second callback';
});
await tester.pump();
await outerDispatcher.invokeCallback(SynchronousFuture<bool>(false));
await tester.pump();
expect(find.text('second callback'), findsOneWidget);
});
}
Widget buildBoilerPlate(Widget child) {