mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Fixes page.onPopInvoked type mismatches (#153593)
fixes https://github.com/flutter/flutter/issues/153150
This commit is contained in:
parent
cdab9d509b
commit
e7da16df76
@ -410,7 +410,7 @@ abstract class Route<T> extends _RoutePlaceholder {
|
|||||||
@mustCallSuper
|
@mustCallSuper
|
||||||
void onPopInvokedWithResult(bool didPop, T? result) {
|
void onPopInvokedWithResult(bool didPop, T? result) {
|
||||||
if (_isPageBased) {
|
if (_isPageBased) {
|
||||||
final Page<Object?> page = settings as Page<Object?>;
|
final Page<T> page = settings as Page<T>;
|
||||||
page.onPopInvoked(didPop, result);
|
page.onPopInvoked(didPop, result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5352,6 +5352,56 @@ void main() {
|
|||||||
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }),
|
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.android }),
|
||||||
skip: isBrowser, // [intended] only non-web Android supports predictive back.
|
skip: isBrowser, // [intended] only non-web Android supports predictive back.
|
||||||
);
|
);
|
||||||
|
|
||||||
|
testWidgets('canPop and onPopInvoked', (WidgetTester tester) async {
|
||||||
|
bool page2CanPop = false;
|
||||||
|
bool page3CanPop = false;
|
||||||
|
final CanPopPage<int> page1 = CanPopPage<int>(name: 'page1', pageCanPop: () => false);
|
||||||
|
final CanPopPage<String> page2 = CanPopPage<String>(name: 'page2', pageCanPop: () => page2CanPop);
|
||||||
|
final CanPopPage<bool> page3 = CanPopPage<bool>(name: 'page3', pageCanPop: () => page3CanPop);
|
||||||
|
final List<Page<Object?>> pages = <Page<Object?>>[page1, page2, page3];
|
||||||
|
final GlobalKey<NavigatorState> key = GlobalKey<NavigatorState>();
|
||||||
|
await tester.pumpWidget(
|
||||||
|
MaterialApp(
|
||||||
|
home: Navigator(
|
||||||
|
key: key,
|
||||||
|
pages: pages,
|
||||||
|
onDidRemovePage: (Page<Object?> page) => pages.remove(page),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(find.text('page3'), findsOneWidget);
|
||||||
|
|
||||||
|
key.currentState!.maybePop(true);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
expect(find.text('page3'), findsOneWidget);
|
||||||
|
expect(page3.popInvoked, <CanPopPageInvoke>[(false, true)]);
|
||||||
|
|
||||||
|
page3CanPop = true;
|
||||||
|
key.currentState!.maybePop(false);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
expect(find.text('page3'), findsNothing);
|
||||||
|
expect(find.text('page2'), findsOneWidget);
|
||||||
|
expect(page3.popInvoked, <CanPopPageInvoke>[(false, true), (true, false)]);
|
||||||
|
|
||||||
|
key.currentState!.maybePop('some string');
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
expect(find.text('page2'), findsOneWidget);
|
||||||
|
expect(page2.popInvoked, <CanPopPageInvoke>[(false, 'some string')]);
|
||||||
|
|
||||||
|
page2CanPop = true;
|
||||||
|
key.currentState!.maybePop('another string');
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
expect(find.text('page2'), findsNothing);
|
||||||
|
expect(find.text('page1'), findsOneWidget);
|
||||||
|
expect(page2.popInvoked, <CanPopPageInvoke>[(false, 'some string'), (true, 'another string')]);
|
||||||
|
|
||||||
|
key.currentState!.maybePop(1);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
expect(find.text('page1'), findsOneWidget);
|
||||||
|
expect(page1.popInvoked, <CanPopPageInvoke>[(false, 1)]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -5487,6 +5537,36 @@ class ZeroTransitionPage extends Page<void> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef CanPopPageInvoke = (bool didPop, Object? result);
|
||||||
|
|
||||||
|
class CanPopPage<T> extends Page<T> {
|
||||||
|
CanPopPage({
|
||||||
|
super.key,
|
||||||
|
super.name,
|
||||||
|
required this.pageCanPop,
|
||||||
|
super.arguments,
|
||||||
|
});
|
||||||
|
|
||||||
|
final List<CanPopPageInvoke> popInvoked = <CanPopPageInvoke>[];
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool get canPop => pageCanPop();
|
||||||
|
final ValueGetter<bool> pageCanPop;
|
||||||
|
|
||||||
|
@override
|
||||||
|
PopInvokedWithResultCallback<T> get onPopInvoked => (bool didPop, T? result) {
|
||||||
|
popInvoked.add((didPop, result));
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Route<T> createRoute(BuildContext context) {
|
||||||
|
return MaterialPageRoute<T>(
|
||||||
|
builder: (BuildContext context) => Text(name!),
|
||||||
|
settings: this,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class TestPage extends Page<void> {
|
class TestPage extends Page<void> {
|
||||||
const TestPage({
|
const TestPage({
|
||||||
super.key,
|
super.key,
|
||||||
|
Loading…
Reference in New Issue
Block a user