Skip to content

Commit e7da16d

Browse files
authored
Fixes page.onPopInvoked type mismatches (#153593)
fixes flutter/flutter#153150
1 parent cdab9d5 commit e7da16d

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

packages/flutter/lib/src/widgets/navigator.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,7 @@ abstract class Route<T> extends _RoutePlaceholder {
410410
@mustCallSuper
411411
void onPopInvokedWithResult(bool didPop, T? result) {
412412
if (_isPageBased) {
413-
final Page<Object?> page = settings as Page<Object?>;
413+
final Page<T> page = settings as Page<T>;
414414
page.onPopInvoked(didPop, result);
415415
}
416416
}

packages/flutter/test/widgets/navigator_test.dart

+80
Original file line numberDiff line numberDiff line change
@@ -5352,6 +5352,56 @@ void main() {
53525352
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }),
53535353
skip: isBrowser, // [intended] only non-web Android supports predictive back.
53545354
);
5355+
5356+
testWidgets('canPop and onPopInvoked', (WidgetTester tester) async {
5357+
bool page2CanPop = false;
5358+
bool page3CanPop = false;
5359+
final CanPopPage<int> page1 = CanPopPage<int>(name: 'page1', pageCanPop: () => false);
5360+
final CanPopPage<String> page2 = CanPopPage<String>(name: 'page2', pageCanPop: () => page2CanPop);
5361+
final CanPopPage<bool> page3 = CanPopPage<bool>(name: 'page3', pageCanPop: () => page3CanPop);
5362+
final List<Page<Object?>> pages = <Page<Object?>>[page1, page2, page3];
5363+
final GlobalKey<NavigatorState> key = GlobalKey<NavigatorState>();
5364+
await tester.pumpWidget(
5365+
MaterialApp(
5366+
home: Navigator(
5367+
key: key,
5368+
pages: pages,
5369+
onDidRemovePage: (Page<Object?> page) => pages.remove(page),
5370+
),
5371+
),
5372+
);
5373+
5374+
expect(find.text('page3'), findsOneWidget);
5375+
5376+
key.currentState!.maybePop(true);
5377+
await tester.pumpAndSettle();
5378+
expect(find.text('page3'), findsOneWidget);
5379+
expect(page3.popInvoked, <CanPopPageInvoke>[(false, true)]);
5380+
5381+
page3CanPop = true;
5382+
key.currentState!.maybePop(false);
5383+
await tester.pumpAndSettle();
5384+
expect(find.text('page3'), findsNothing);
5385+
expect(find.text('page2'), findsOneWidget);
5386+
expect(page3.popInvoked, <CanPopPageInvoke>[(false, true), (true, false)]);
5387+
5388+
key.currentState!.maybePop('some string');
5389+
await tester.pumpAndSettle();
5390+
expect(find.text('page2'), findsOneWidget);
5391+
expect(page2.popInvoked, <CanPopPageInvoke>[(false, 'some string')]);
5392+
5393+
page2CanPop = true;
5394+
key.currentState!.maybePop('another string');
5395+
await tester.pumpAndSettle();
5396+
expect(find.text('page2'), findsNothing);
5397+
expect(find.text('page1'), findsOneWidget);
5398+
expect(page2.popInvoked, <CanPopPageInvoke>[(false, 'some string'), (true, 'another string')]);
5399+
5400+
key.currentState!.maybePop(1);
5401+
await tester.pumpAndSettle();
5402+
expect(find.text('page1'), findsOneWidget);
5403+
expect(page1.popInvoked, <CanPopPageInvoke>[(false, 1)]);
5404+
});
53555405
});
53565406
});
53575407
}
@@ -5487,6 +5537,36 @@ class ZeroTransitionPage extends Page<void> {
54875537
}
54885538
}
54895539

5540+
typedef CanPopPageInvoke = (bool didPop, Object? result);
5541+
5542+
class CanPopPage<T> extends Page<T> {
5543+
CanPopPage({
5544+
super.key,
5545+
super.name,
5546+
required this.pageCanPop,
5547+
super.arguments,
5548+
});
5549+
5550+
final List<CanPopPageInvoke> popInvoked = <CanPopPageInvoke>[];
5551+
5552+
@override
5553+
bool get canPop => pageCanPop();
5554+
final ValueGetter<bool> pageCanPop;
5555+
5556+
@override
5557+
PopInvokedWithResultCallback<T> get onPopInvoked => (bool didPop, T? result) {
5558+
popInvoked.add((didPop, result));
5559+
};
5560+
5561+
@override
5562+
Route<T> createRoute(BuildContext context) {
5563+
return MaterialPageRoute<T>(
5564+
builder: (BuildContext context) => Text(name!),
5565+
settings: this,
5566+
);
5567+
}
5568+
}
5569+
54905570
class TestPage extends Page<void> {
54915571
const TestPage({
54925572
super.key,

0 commit comments

Comments
 (0)