Add HeroController to CupertinoApp (#19326)
This commit is contained in:
parent
8359d99e48
commit
e32e44799a
@ -42,6 +42,9 @@ const TextStyle _kDefaultTextStyle = const TextStyle(
|
|||||||
/// If [home], [routes], [onGenerateRoute], and [onUnknownRoute] are all null,
|
/// If [home], [routes], [onGenerateRoute], and [onUnknownRoute] are all null,
|
||||||
/// and [builder] is not null, then no [Navigator] is created.
|
/// and [builder] is not null, then no [Navigator] is created.
|
||||||
///
|
///
|
||||||
|
/// This widget also configures the observer of the top-level [Navigator] (if
|
||||||
|
/// any) to perform [Hero] animations.
|
||||||
|
///
|
||||||
/// Using this widget with caution on Android since it may produce behaviors
|
/// Using this widget with caution on Android since it may produce behaviors
|
||||||
/// Android users are not expecting such as:
|
/// Android users are not expecting such as:
|
||||||
///
|
///
|
||||||
@ -171,7 +174,7 @@ class CupertinoApp extends StatefulWidget {
|
|||||||
/// When a named route is pushed with [Navigator.pushNamed], the route name is
|
/// When a named route is pushed with [Navigator.pushNamed], the route name is
|
||||||
/// looked up in this map. If the name is present, the associated
|
/// looked up in this map. If the name is present, the associated
|
||||||
/// [WidgetBuilder] is used to construct a [CupertinoPageRoute] that performs
|
/// [WidgetBuilder] is used to construct a [CupertinoPageRoute] that performs
|
||||||
/// an appropriate transition to the new route.
|
/// an appropriate transition, including [Hero] animations, to the new route.
|
||||||
///
|
///
|
||||||
/// If the app only has one page, then you can specify it using [home] instead.
|
/// If the app only has one page, then you can specify it using [home] instead.
|
||||||
///
|
///
|
||||||
@ -246,8 +249,8 @@ class CupertinoApp extends StatefulWidget {
|
|||||||
///
|
///
|
||||||
/// Unless a [Navigator] is provided, either implicitly from [builder] being
|
/// Unless a [Navigator] is provided, either implicitly from [builder] being
|
||||||
/// null, or by a [builder] including its `child` argument, or by a [builder]
|
/// null, or by a [builder] including its `child` argument, or by a [builder]
|
||||||
/// explicitly providing a [Navigator] of its own, APIs such as
|
/// explicitly providing a [Navigator] of its own, widgets and APIs such as
|
||||||
/// [Navigator.push] and [Navigator.pop], will not function.
|
/// [Hero], [Navigator.push] and [Navigator.pop], will not function.
|
||||||
final TransitionBuilder builder;
|
final TransitionBuilder builder;
|
||||||
|
|
||||||
/// {@macro flutter.widgets.widgetsApp.title}
|
/// {@macro flutter.widgets.widgetsApp.title}
|
||||||
@ -317,9 +320,13 @@ class _AlwaysCupertinoScrollBehavior extends ScrollBehavior {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _CupertinoAppState extends State<CupertinoApp> {
|
class _CupertinoAppState extends State<CupertinoApp> {
|
||||||
|
HeroController _heroController;
|
||||||
|
List<NavigatorObserver> _navigatorObservers;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
|
_heroController = new HeroController(); // Linear tweening.
|
||||||
_updateNavigator();
|
_updateNavigator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,6 +342,9 @@ class _CupertinoAppState extends State<CupertinoApp> {
|
|||||||
widget.routes.isNotEmpty ||
|
widget.routes.isNotEmpty ||
|
||||||
widget.onGenerateRoute != null ||
|
widget.onGenerateRoute != null ||
|
||||||
widget.onUnknownRoute != null;
|
widget.onUnknownRoute != null;
|
||||||
|
_navigatorObservers =
|
||||||
|
new List<NavigatorObserver>.from(widget.navigatorObservers)
|
||||||
|
..add(_heroController);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget defaultBuilder(BuildContext context, Widget child) {
|
Widget defaultBuilder(BuildContext context, Widget child) {
|
||||||
@ -351,7 +361,7 @@ class _CupertinoAppState extends State<CupertinoApp> {
|
|||||||
routes: widget.routes,
|
routes: widget.routes,
|
||||||
onGenerateRoute: widget.onGenerateRoute,
|
onGenerateRoute: widget.onGenerateRoute,
|
||||||
onUnknownRoute: widget.onUnknownRoute,
|
onUnknownRoute: widget.onUnknownRoute,
|
||||||
navigatorObservers: widget.navigatorObservers,
|
navigatorObservers: _navigatorObservers,
|
||||||
);
|
);
|
||||||
if (widget.builder != null) {
|
if (widget.builder != null) {
|
||||||
return widget.builder(context, navigator);
|
return widget.builder(context, navigator);
|
||||||
|
43
packages/flutter/test/cupertino/app_test.dart
Normal file
43
packages/flutter/test/cupertino/app_test.dart
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright 2018 The Chromium Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
testWidgets('Heroes work', (WidgetTester tester) async {
|
||||||
|
await tester.pumpWidget(new CupertinoApp(
|
||||||
|
home:
|
||||||
|
new ListView(
|
||||||
|
children: <Widget>[
|
||||||
|
const Hero(tag: 'a', child: const Text('foo')),
|
||||||
|
new Builder(builder: (BuildContext context) {
|
||||||
|
return new CupertinoButton(
|
||||||
|
child: const Text('next'),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
new CupertinoPageRoute<void>(
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return const Hero(tag: 'a', child: const Text('foo'));
|
||||||
|
}
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
||||||
|
await tester.tap(find.text('next'));
|
||||||
|
await tester.pump();
|
||||||
|
await tester.pump(const Duration(milliseconds: 100));
|
||||||
|
|
||||||
|
// During the hero transition, the hero widget is lifted off of both
|
||||||
|
// page routes and exists as its own overlay on top of both routes.
|
||||||
|
expect(find.widgetWithText(CupertinoPageRoute, 'foo'), findsNothing);
|
||||||
|
expect(find.widgetWithText(Navigator, 'foo'), findsOneWidget);
|
||||||
|
});
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user