Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
Front-End
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
abdullh.alsoleman
Front-End
Commits
a663d255
Commit
a663d255
authored
Feb 05, 2016
by
Adam Barth
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add more dartdoc to widgets.dart
Making progress documenting the widget library.
parent
0e33151e
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
194 additions
and
10 deletions
+194
-10
focus.dart
packages/flutter/lib/src/widgets/focus.dart
+31
-0
gridpaper.dart
packages/flutter/lib/src/widgets/gridpaper.dart
+8
-0
implicit_animations.dart
packages/flutter/lib/src/widgets/implicit_animations.dart
+9
-4
locale_query.dart
packages/flutter/lib/src/widgets/locale_query.dart
+2
-0
mimic.dart
packages/flutter/lib/src/widgets/mimic.dart
+3
-0
navigator.dart
packages/flutter/lib/src/widgets/navigator.dart
+123
-6
notification_listener.dart
packages/flutter/lib/src/widgets/notification_listener.dart
+5
-0
page_storage.dart
packages/flutter/lib/src/widgets/page_storage.dart
+13
-0
No files found.
packages/flutter/lib/src/widgets/focus.dart
View file @
a663d255
...
@@ -69,6 +69,28 @@ class _FocusScope extends InheritedWidget {
...
@@ -69,6 +69,28 @@ class _FocusScope extends InheritedWidget {
}
}
}
}
/// A scope for managing the focus state of descendant widgets.
///
/// The focus represents where the user's attention is directed. If the use
/// interacts with the system in a way that isn't visually directed at a
/// particular widget (e.g., by typing on a keyboard), the interaction is
/// directed to the currently focused widget.
///
/// The focus system consists of a tree of Focus widgets, which is embedded in
/// the widget tree. Focus widgets themselves can be focused in their enclosing
/// Focus widget, which means that their subtree is the one that has the current
/// focus. For example, a dialog creates a Focus widget to maintain focus
/// within the dialog. When the dialog closes, its Focus widget is removed from
/// the tree and focus is restored to whichever other part of the Focus tree
/// previously had focus.
///
/// In addition to tracking which enclosed Focus widget has focus, each Focus
/// widget also tracks a GlobalKey, which represents the currently focused
/// widget in this part of the focus tree. If this Focus widget is the currently
/// focused subtree of the focus system (i.e., the path from it to the root is
/// focused at each level and it hasn't focused any of its enclosed Focus
/// widgets), then the widget this this global key actually has the focus in the
/// entire system.
class
Focus
extends
StatefulComponent
{
class
Focus
extends
StatefulComponent
{
Focus
({
Focus
({
GlobalKey
key
,
GlobalKey
key
,
...
@@ -79,8 +101,15 @@ class Focus extends StatefulComponent {
...
@@ -79,8 +101,15 @@ class Focus extends StatefulComponent {
final
Widget
child
;
final
Widget
child
;
/// The key that currently has focus globally in the entire focus tree.
///
/// This field is always null except in checked mode.
static
GlobalKey
debugOnlyFocusedKey
;
static
GlobalKey
debugOnlyFocusedKey
;
/// Whether the focus is current at the given context.
///
/// If autofocus is true, the given context will become focused if no other
/// widget is already focused.
static
bool
at
(
BuildContext
context
,
{
bool
autofocus:
false
})
{
static
bool
at
(
BuildContext
context
,
{
bool
autofocus:
false
})
{
assert
(
context
!=
null
);
assert
(
context
!=
null
);
assert
(
context
.
widget
!=
null
);
assert
(
context
.
widget
!=
null
);
...
@@ -134,6 +163,8 @@ class Focus extends StatefulComponent {
...
@@ -134,6 +163,8 @@ class Focus extends StatefulComponent {
}
}
}
}
/// Unfocuses the currently focused widget (if any) in the Focus that most
/// tightly encloses the given context.
static
void
clear
(
BuildContext
context
)
{
static
void
clear
(
BuildContext
context
)
{
_FocusScope
focusScope
=
context
.
ancestorWidgetOfExactType
(
_FocusScope
);
_FocusScope
focusScope
=
context
.
ancestorWidgetOfExactType
(
_FocusScope
);
if
(
focusScope
!=
null
)
if
(
focusScope
!=
null
)
...
...
packages/flutter/lib/src/widgets/gridpaper.dart
View file @
a663d255
...
@@ -56,10 +56,18 @@ class GridPaper extends StatelessComponent {
...
@@ -56,10 +56,18 @@ class GridPaper extends StatelessComponent {
this
.
child
this
.
child
})
:
super
(
key:
key
);
})
:
super
(
key:
key
);
/// The color to draw the lines in the grid.
final
Color
color
;
final
Color
color
;
/// The distance between the primary lines in the grid, in logical pixels.
final
double
interval
;
final
double
interval
;
/// The number of major divisions within each primary grid cell.
final
int
divisions
;
final
int
divisions
;
/// The number of minor divisions within each major division.
final
int
subDivisions
;
final
int
subDivisions
;
final
Widget
child
;
final
Widget
child
;
Widget
build
(
BuildContext
context
)
{
Widget
build
(
BuildContext
context
)
{
...
...
packages/flutter/lib/src/widgets/implicit_animations.dart
View file @
a663d255
...
@@ -9,14 +9,14 @@ import 'framework.dart';
...
@@ -9,14 +9,14 @@ import 'framework.dart';
import
'package:vector_math/vector_math_64.dart'
;
import
'package:vector_math/vector_math_64.dart'
;
/// An
animated value that interpolates
[BoxConstraint]s.
/// An
interpolation between two
[BoxConstraint]s.
class
BoxConstraintsTween
extends
Tween
<
BoxConstraints
>
{
class
BoxConstraintsTween
extends
Tween
<
BoxConstraints
>
{
BoxConstraintsTween
({
BoxConstraints
begin
,
BoxConstraints
end
})
:
super
(
begin:
begin
,
end:
end
);
BoxConstraintsTween
({
BoxConstraints
begin
,
BoxConstraints
end
})
:
super
(
begin:
begin
,
end:
end
);
BoxConstraints
lerp
(
double
t
)
=>
BoxConstraints
.
lerp
(
begin
,
end
,
t
);
BoxConstraints
lerp
(
double
t
)
=>
BoxConstraints
.
lerp
(
begin
,
end
,
t
);
}
}
/// An
animated value that interpolates
[Decoration]s.
/// An
interpolation between two
[Decoration]s.
class
DecorationTween
extends
Tween
<
Decoration
>
{
class
DecorationTween
extends
Tween
<
Decoration
>
{
DecorationTween
({
Decoration
begin
,
Decoration
end
})
:
super
(
begin:
begin
,
end:
end
);
DecorationTween
({
Decoration
begin
,
Decoration
end
})
:
super
(
begin:
begin
,
end:
end
);
...
@@ -29,14 +29,14 @@ class DecorationTween extends Tween<Decoration> {
...
@@ -29,14 +29,14 @@ class DecorationTween extends Tween<Decoration> {
}
}
}
}
/// An
animated value that interpolates [EdgeDims]
.
/// An
interpolation between two [EdgeDims]s
.
class
EdgeDimsTween
extends
Tween
<
EdgeDims
>
{
class
EdgeDimsTween
extends
Tween
<
EdgeDims
>
{
EdgeDimsTween
({
EdgeDims
begin
,
EdgeDims
end
})
:
super
(
begin:
begin
,
end:
end
);
EdgeDimsTween
({
EdgeDims
begin
,
EdgeDims
end
})
:
super
(
begin:
begin
,
end:
end
);
EdgeDims
lerp
(
double
t
)
=>
EdgeDims
.
lerp
(
begin
,
end
,
t
);
EdgeDims
lerp
(
double
t
)
=>
EdgeDims
.
lerp
(
begin
,
end
,
t
);
}
}
/// An
animated value that interpolates
[Matrix4]s.
/// An
interpolation between two
[Matrix4]s.
///
///
/// Currently this class works only for translations.
/// Currently this class works only for translations.
class
Matrix4Tween
extends
Tween
<
Matrix4
>
{
class
Matrix4Tween
extends
Tween
<
Matrix4
>
{
...
@@ -78,12 +78,17 @@ abstract class AnimatedWidgetBase extends StatefulComponent {
...
@@ -78,12 +78,17 @@ abstract class AnimatedWidgetBase extends StatefulComponent {
}
}
}
}
/// Used by [AnimatedWidgetBaseState].
typedef
Tween
<
T
>
TweenConstructor
<
T
>(
T
targetValue
);
typedef
Tween
<
T
>
TweenConstructor
<
T
>(
T
targetValue
);
/// Used by [AnimatedWidgetBaseState].
typedef
Tween
<
T
>
TweenVisitor
<
T
>(
Tween
<
T
>
tween
,
T
targetValue
,
TweenConstructor
<
T
>
constructor
);
typedef
Tween
<
T
>
TweenVisitor
<
T
>(
Tween
<
T
>
tween
,
T
targetValue
,
TweenConstructor
<
T
>
constructor
);
/// A base class for widgets with implicit animations.
abstract
class
AnimatedWidgetBaseState
<
T
extends
AnimatedWidgetBase
>
extends
State
<
T
>
{
abstract
class
AnimatedWidgetBaseState
<
T
extends
AnimatedWidgetBase
>
extends
State
<
T
>
{
AnimationController
_controller
;
AnimationController
_controller
;
/// The animation driving this widget's implicit animations.
Animation
<
double
>
get
animation
=>
_animation
;
Animation
<
double
>
get
animation
=>
_animation
;
Animation
<
double
>
_animation
;
Animation
<
double
>
_animation
;
...
...
packages/flutter/lib/src/widgets/locale_query.dart
View file @
a663d255
...
@@ -7,6 +7,7 @@ import 'framework.dart';
...
@@ -7,6 +7,7 @@ import 'framework.dart';
/// Superclass for locale-specific data provided by the application.
/// Superclass for locale-specific data provided by the application.
class
LocaleQueryData
{
}
class
LocaleQueryData
{
}
/// Establishes a subtree in which locale queries resolve to the given data.
class
LocaleQuery
<
T
extends
LocaleQueryData
>
extends
InheritedWidget
{
class
LocaleQuery
<
T
extends
LocaleQueryData
>
extends
InheritedWidget
{
LocaleQuery
({
LocaleQuery
({
Key
key
,
Key
key
,
...
@@ -16,6 +17,7 @@ class LocaleQuery<T extends LocaleQueryData> extends InheritedWidget {
...
@@ -16,6 +17,7 @@ class LocaleQuery<T extends LocaleQueryData> extends InheritedWidget {
assert
(
child
!=
null
);
assert
(
child
!=
null
);
}
}
/// The locale data for this subtree.
final
T
data
;
final
T
data
;
/// The data from the closest instance of this class that encloses the given context.
/// The data from the closest instance of this class that encloses the given context.
...
...
packages/flutter/lib/src/widgets/mimic.dart
View file @
a663d255
...
@@ -144,6 +144,9 @@ class Mimicable extends StatefulComponent {
...
@@ -144,6 +144,9 @@ class Mimicable extends StatefulComponent {
MimicableState
createState
()
=>
new
MimicableState
();
MimicableState
createState
()
=>
new
MimicableState
();
}
}
/// The state for a [Mimicable].
///
/// Exposes an API for starting and stopping mimicking.
class
MimicableState
extends
State
<
Mimicable
>
{
class
MimicableState
extends
State
<
Mimicable
>
{
Size
_size
;
Size
_size
;
bool
_beingMimicked
=
false
;
bool
_beingMimicked
=
false
;
...
...
packages/flutter/lib/src/widgets/navigator.dart
View file @
a663d255
...
@@ -5,11 +5,18 @@
...
@@ -5,11 +5,18 @@
import
'framework.dart'
;
import
'framework.dart'
;
import
'overlay.dart'
;
import
'overlay.dart'
;
/// An abstraction for an entry managed by a [Navigator].
///
/// This class defines an abstract interface between the navigator and the
/// "routes" that are pushed on and popped off the navigator. Most routes have
/// visual affordances, which they place in the navigators [Overlay] using one
/// or more [OverlayEntry] objects.
abstract
class
Route
<
T
>
{
abstract
class
Route
<
T
>
{
/// The navigator that the route is in, if any.
/// The navigator that the route is in, if any.
NavigatorState
get
navigator
=>
_navigator
;
NavigatorState
get
navigator
=>
_navigator
;
NavigatorState
_navigator
;
NavigatorState
_navigator
;
/// The overlay entries for this route.
List
<
OverlayEntry
>
get
overlayEntries
=>
const
<
OverlayEntry
>[];
List
<
OverlayEntry
>
get
overlayEntries
=>
const
<
OverlayEntry
>[];
/// Called when the route is inserted into the navigator.
/// Called when the route is inserted into the navigator.
...
@@ -66,6 +73,7 @@ abstract class Route<T> {
...
@@ -66,6 +73,7 @@ abstract class Route<T> {
}
}
}
}
/// Data that might be useful in constructing a [Route].
class
RouteSettings
{
class
RouteSettings
{
const
RouteSettings
({
const
RouteSettings
({
this
.
name
,
this
.
name
,
...
@@ -73,8 +81,20 @@ class RouteSettings {
...
@@ -73,8 +81,20 @@ class RouteSettings {
this
.
isInitialRoute
:
false
this
.
isInitialRoute
:
false
});
});
/// The name of the route (e.g., "/settings").
final
String
name
;
final
String
name
;
/// The set of keys that are most relevant for constructoring [Hero]
/// transitions. For example, if the current route contains a list of music
/// albums and the user triggered this navigation by tapping one of the
/// albums, the most valuable album cover is the one associated with the album
/// the user tapped and is the one that should heroically transition when
/// opening the details page for that album.
final
Set
<
Key
>
mostValuableKeys
;
final
Set
<
Key
>
mostValuableKeys
;
/// Whether this route is the very first route being pushed onto this [Navigator].
///
/// The initial route typically skips any entrance transition to speed startup.
final
bool
isInitialRoute
;
final
bool
isInitialRoute
;
String
toString
()
{
String
toString
()
{
...
@@ -88,17 +108,33 @@ class RouteSettings {
...
@@ -88,17 +108,33 @@ class RouteSettings {
}
}
}
}
/// Creates a route for the given route settings.
typedef
Route
RouteFactory
(
RouteSettings
settings
);
typedef
Route
RouteFactory
(
RouteSettings
settings
);
/// A callback in during which you can perform a number of navigator operations (e.g., pop, push) that happen atomically.
typedef
void
NavigatorTransactionCallback
(
NavigatorTransaction
transaction
);
typedef
void
NavigatorTransactionCallback
(
NavigatorTransaction
transaction
);
/// An interface for observing the behavior of a [Navigator].
class
NavigatorObserver
{
class
NavigatorObserver
{
/// The navigator that the observer is observing, if any.
/// The navigator that the observer is observing, if any.
NavigatorState
get
navigator
=>
_navigator
;
NavigatorState
get
navigator
=>
_navigator
;
NavigatorState
_navigator
;
NavigatorState
_navigator
;
/// The [Navigator] pushed the given route.
void
didPush
(
Route
route
,
Route
previousRoute
)
{
}
void
didPush
(
Route
route
,
Route
previousRoute
)
{
}
/// THe [Navigator] popped the given route.
void
didPop
(
Route
route
,
Route
previousRoute
)
{
}
void
didPop
(
Route
route
,
Route
previousRoute
)
{
}
}
}
/// Manages a set of child widgets with a stack discipline.
///
/// Many apps have a navigator near the top of their widget hierarchy in order
/// to display their logical history using an [Overlay] with the most recently
/// visited pages visually on top of the older pages. Using this pattern lets
/// the navigator visually transition from one page to another by the widgets
/// around in the overlay. Similarly, the navigator can be used to show a dialog
/// by positioning the dialog widget above the current page.
class
Navigator
extends
StatefulComponent
{
class
Navigator
extends
StatefulComponent
{
Navigator
({
Navigator
({
Key
key
,
Key
key
,
...
@@ -110,25 +146,72 @@ class Navigator extends StatefulComponent {
...
@@ -110,25 +146,72 @@ class Navigator extends StatefulComponent {
assert
(
onGenerateRoute
!=
null
);
assert
(
onGenerateRoute
!=
null
);
}
}
/// The name of the first route to show.
final
String
initialRoute
;
final
String
initialRoute
;
/// Called to generate a route for a given [RouteSettings].
final
RouteFactory
onGenerateRoute
;
final
RouteFactory
onGenerateRoute
;
/// Called when [onGenerateRoute] fails to generate a route.
///
/// This callback is typically used for error handling. For example, this
/// callback might always generate a "not found" page that describes the route
/// that wasn't found.
///
/// Unknown routes can arise either from errors in the app or from external
/// requests to push routes, such as from Android intents.
final
RouteFactory
onUnknownRoute
;
final
RouteFactory
onUnknownRoute
;
/// An observer for this navigator.
final
NavigatorObserver
observer
;
final
NavigatorObserver
observer
;
/// The default name for the initial route.
static
const
String
defaultRouteName
=
'/'
;
static
const
String
defaultRouteName
=
'/'
;
/// Push a named route onto the navigator that most tightly encloses the given context.
///
/// The route name will be passed to that navigator's [onGenerateRoute]
/// callback. The returned route will be pushed into the navigator. The set of
/// most valuable keys will be used to construct an appropriate [Hero] transition.
///
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
static
void
pushNamed
(
BuildContext
context
,
String
routeName
,
{
Set
<
Key
>
mostValuableKeys
})
{
static
void
pushNamed
(
BuildContext
context
,
String
routeName
,
{
Set
<
Key
>
mostValuableKeys
})
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
transaction
.
pushNamed
(
routeName
,
mostValuableKeys:
mostValuableKeys
);
transaction
.
pushNamed
(
routeName
,
mostValuableKeys:
mostValuableKeys
);
});
});
}
}
/// Push a route onto the navigator that most tightly encloses the given context.
///
/// Adds the given route to the Navigator's history, and transitions to it.
/// The route will have didPush() and didChangeNext() called on it; the
/// previous route, if any, will have didChangeNext() called on it; and the
/// Navigator observer, if any, will have didPush() called on it.
///
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
static
void
push
(
BuildContext
context
,
Route
route
)
{
static
void
push
(
BuildContext
context
,
Route
route
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
transaction
.
push
(
route
);
transaction
.
push
(
route
);
});
});
}
}
/// Pop a route off the navigator that most tightly encloses the given context.
///
/// Tries to removes the current route, calling its didPop() method. If that
/// method returns false, then nothing else happens. Otherwise, the observer
/// (if any) is notified using its didPop() method, and the previous route is
/// notified using [Route.didChangeNext].
///
/// If non-null, [result] will be used as the result of the route. Routes
/// such as dialogs or popup menus typically use this mechanism to return the
/// value selected by the user to the widget that created their route. The
/// type of [result], if provided, must match the type argument of the class
/// of the current route. (In practice, this is usually "dynamic".)
///
/// Returns true if a route was popped; returns false if there are no further
/// previous routes.
///
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
static
bool
pop
(
BuildContext
context
,
[
dynamic
result
])
{
static
bool
pop
(
BuildContext
context
,
[
dynamic
result
])
{
bool
returnValue
;
bool
returnValue
;
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
...
@@ -137,17 +220,30 @@ class Navigator extends StatefulComponent {
...
@@ -137,17 +220,30 @@ class Navigator extends StatefulComponent {
return
returnValue
;
return
returnValue
;
}
}
/// Calls pop() repeatedly until the given route is the current route.
/// If it is already the current route, nothing happens.
///
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
static
void
popUntil
(
BuildContext
context
,
Route
targetRoute
)
{
static
void
popUntil
(
BuildContext
context
,
Route
targetRoute
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
transaction
.
popUntil
(
targetRoute
);
transaction
.
popUntil
(
targetRoute
);
});
});
}
}
/// Whether the navigator that most tightly encloses the given context can be popped.
///
/// The initial route cannot be popped off the navigator, which implies that
/// this function returns true only if popping the navigator would not remove
/// the initial route.
static
bool
canPop
(
BuildContext
context
)
{
static
bool
canPop
(
BuildContext
context
)
{
NavigatorState
navigator
=
context
.
ancestorStateOfType
(
const
TypeMatcher
<
NavigatorState
>());
NavigatorState
navigator
=
context
.
ancestorStateOfType
(
const
TypeMatcher
<
NavigatorState
>());
return
navigator
!=
null
&&
navigator
.
canPop
();
return
navigator
!=
null
&&
navigator
.
canPop
();
}
}
/// Executes a simple transaction that both pops the current route off and
/// pushes a named route into the navigator that most tightly encloses the given context.
///
/// Uses [openTransaction()]. Only one transaction will be executed per frame.
static
void
popAndPushNamed
(
BuildContext
context
,
String
routeName
,
{
Set
<
Key
>
mostValuableKeys
})
{
static
void
popAndPushNamed
(
BuildContext
context
,
String
routeName
,
{
Set
<
Key
>
mostValuableKeys
})
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
openTransaction
(
context
,
(
NavigatorTransaction
transaction
)
{
transaction
.
pop
();
transaction
.
pop
();
...
@@ -155,6 +251,12 @@ class Navigator extends StatefulComponent {
...
@@ -155,6 +251,12 @@ class Navigator extends StatefulComponent {
});
});
}
}
/// Calls callback immediately to create a navigator transaction.
///
/// To avoid race conditions, a navigator will execute at most one operation
/// per animation frame. If you wish to perform a compound change to the
/// navigator's state, you can use a navigator transaction to execute all the
/// changes atomically by making the changes inside the given callback.
static
void
openTransaction
(
BuildContext
context
,
NavigatorTransactionCallback
callback
)
{
static
void
openTransaction
(
BuildContext
context
,
NavigatorTransactionCallback
callback
)
{
NavigatorState
navigator
=
context
.
ancestorStateOfType
(
const
TypeMatcher
<
NavigatorState
>());
NavigatorState
navigator
=
context
.
ancestorStateOfType
(
const
TypeMatcher
<
NavigatorState
>());
assert
(()
{
assert
(()
{
...
@@ -168,6 +270,7 @@ class Navigator extends StatefulComponent {
...
@@ -168,6 +270,7 @@ class Navigator extends StatefulComponent {
NavigatorState
createState
()
=>
new
NavigatorState
();
NavigatorState
createState
()
=>
new
NavigatorState
();
}
}
/// The state for a [Navigator] widget.
class
NavigatorState
extends
State
<
Navigator
>
{
class
NavigatorState
extends
State
<
Navigator
>
{
final
GlobalKey
<
OverlayState
>
_overlayKey
=
new
GlobalKey
<
OverlayState
>();
final
GlobalKey
<
OverlayState
>
_overlayKey
=
new
GlobalKey
<
OverlayState
>();
final
List
<
Route
>
_history
=
new
List
<
Route
>();
final
List
<
Route
>
_history
=
new
List
<
Route
>();
...
@@ -202,7 +305,7 @@ class NavigatorState extends State<Navigator> {
...
@@ -202,7 +305,7 @@ class NavigatorState extends State<Navigator> {
assert
(()
{
_debugLocked
=
false
;
return
true
;
});
assert
(()
{
_debugLocked
=
false
;
return
true
;
});
}
}
//
Used by Routes and NavigatorObservers
//
/ The overlay this navigator uses for its visual presentation.
OverlayState
get
overlay
=>
_overlayKey
.
currentState
;
OverlayState
get
overlay
=>
_overlayKey
.
currentState
;
OverlayEntry
get
_currentOverlayEntry
{
OverlayEntry
get
_currentOverlayEntry
{
...
@@ -344,6 +447,10 @@ class NavigatorState extends State<Navigator> {
...
@@ -344,6 +447,10 @@ class NavigatorState extends State<Navigator> {
_pop
();
_pop
();
}
}
/// Whether this navigator can be popped.
///
/// The only route that cannot be popped off the navigator is the initial
/// route.
bool
canPop
()
{
bool
canPop
()
{
assert
(
_history
.
length
>
0
);
assert
(
_history
.
length
>
0
);
return
_history
.
length
>
1
||
_history
[
0
].
willHandlePopInternally
;
return
_history
.
length
>
1
||
_history
[
0
].
willHandlePopInternally
;
...
@@ -351,6 +458,12 @@ class NavigatorState extends State<Navigator> {
...
@@ -351,6 +458,12 @@ class NavigatorState extends State<Navigator> {
bool
_hadTransaction
=
true
;
bool
_hadTransaction
=
true
;
/// Calls callback immediately to create a navigator transaction.
///
/// To avoid race conditions, a navigator will execute at most one operation
/// per animation frame. If you wish to perform a compound change to the
/// navigator's state, you can use a navigator transaction to execute all the
/// changes atomically by making the changes inside the given callback.
bool
openTransaction
(
NavigatorTransactionCallback
callback
)
{
bool
openTransaction
(
NavigatorTransactionCallback
callback
)
{
assert
(
callback
!=
null
);
assert
(
callback
!=
null
);
if
(
_hadTransaction
)
if
(
_hadTransaction
)
...
@@ -375,6 +488,7 @@ class NavigatorState extends State<Navigator> {
...
@@ -375,6 +488,7 @@ class NavigatorState extends State<Navigator> {
}
}
}
}
/// A sequence of [Navigator] operations that are executed atomically.
class
NavigatorTransaction
{
class
NavigatorTransaction
{
NavigatorTransaction
.
_
(
this
.
_navigator
)
{
NavigatorTransaction
.
_
(
this
.
_navigator
)
{
assert
(
_navigator
!=
null
);
assert
(
_navigator
!=
null
);
...
@@ -382,8 +496,9 @@ class NavigatorTransaction {
...
@@ -382,8 +496,9 @@ class NavigatorTransaction {
NavigatorState
_navigator
;
NavigatorState
_navigator
;
bool
_debugOpen
=
true
;
bool
_debugOpen
=
true
;
/// Invokes the Navigator's onGenerateRoute callback to create a route with
/// The route name will be passed to the navigator's [onGenerateRoute]
/// the given name, then calls [push()] with that route.
/// callback. The returned route will be pushed into the navigator. The set of
/// most valuable keys will be used to construct an appropriate [Hero] transition.
void
pushNamed
(
String
name
,
{
Set
<
Key
>
mostValuableKeys
})
{
void
pushNamed
(
String
name
,
{
Set
<
Key
>
mostValuableKeys
})
{
assert
(
_debugOpen
);
assert
(
_debugOpen
);
_navigator
.
_pushNamed
(
name
,
mostValuableKeys:
mostValuableKeys
);
_navigator
.
_pushNamed
(
name
,
mostValuableKeys:
mostValuableKeys
);
...
@@ -439,9 +554,11 @@ class NavigatorTransaction {
...
@@ -439,9 +554,11 @@ class NavigatorTransaction {
/// (if any) is notified using its didPop() method, and the previous route is
/// (if any) is notified using its didPop() method, and the previous route is
/// notified using [Route.didChangeNext].
/// notified using [Route.didChangeNext].
///
///
/// The type of the result argument, if provided, must match the type argument
/// If non-null, [result] will be used as the result of the route. Routes
/// of the class of the current route. (In practice, this is usually
/// such as dialogs or popup menus typically use this mechanism to return the
/// "dynamic".)
/// value selected by the user to the widget that created their route. The
/// type of [result], if provided, must match the type argument of the class
/// of the current route. (In practice, this is usually "dynamic".)
///
///
/// Returns true if a route was popped; returns false if there are no further
/// Returns true if a route was popped; returns false if there are no further
/// previous routes.
/// previous routes.
...
...
packages/flutter/lib/src/widgets/notification_listener.dart
View file @
a663d255
...
@@ -7,7 +7,9 @@ import 'framework.dart';
...
@@ -7,7 +7,9 @@ import 'framework.dart';
/// Return true to cancel the notification bubbling.
/// Return true to cancel the notification bubbling.
typedef
bool
NotificationListenerCallback
<
T
extends
Notification
>(
T
notification
);
typedef
bool
NotificationListenerCallback
<
T
extends
Notification
>(
T
notification
);
/// A notification that can bubble up the widget tree.
abstract
class
Notification
{
abstract
class
Notification
{
/// Start bubbling this notification at the given build context.
void
dispatch
(
BuildContext
target
)
{
void
dispatch
(
BuildContext
target
)
{
target
.
visitAncestorElements
((
Element
element
)
{
target
.
visitAncestorElements
((
Element
element
)
{
if
(
element
is
StatelessComponentElement
&&
if
(
element
is
StatelessComponentElement
&&
...
@@ -21,6 +23,7 @@ abstract class Notification {
...
@@ -21,6 +23,7 @@ abstract class Notification {
}
}
}
}
/// Listens for [Notification]s bubbling up the tree.
class
NotificationListener
<
T
extends
Notification
>
extends
StatelessComponent
{
class
NotificationListener
<
T
extends
Notification
>
extends
StatelessComponent
{
NotificationListener
({
NotificationListener
({
Key
key
,
Key
key
,
...
@@ -29,6 +32,8 @@ class NotificationListener<T extends Notification> extends StatelessComponent {
...
@@ -29,6 +32,8 @@ class NotificationListener<T extends Notification> extends StatelessComponent {
})
:
super
(
key:
key
);
})
:
super
(
key:
key
);
final
Widget
child
;
final
Widget
child
;
/// Called when a notification of the appropriate type arrives at this location in the tree.
final
NotificationListenerCallback
<
T
>
onNotification
;
final
NotificationListenerCallback
<
T
>
onNotification
;
bool
_dispatch
(
Notification
notification
)
{
bool
_dispatch
(
Notification
notification
)
{
...
...
packages/flutter/lib/src/widgets/page_storage.dart
View file @
a663d255
...
@@ -37,6 +37,10 @@ class _StorageEntryIdentifier {
...
@@ -37,6 +37,10 @@ class _StorageEntryIdentifier {
}
}
}
}
/// A storage bucket associated with a page in an app.
///
/// Useful for storing per-page state that persists across navigations from one
/// page to another.
class
PageStorageBucket
{
class
PageStorageBucket
{
_StorageEntryIdentifier
_computeStorageIdentifier
(
BuildContext
context
)
{
_StorageEntryIdentifier
_computeStorageIdentifier
(
BuildContext
context
)
{
_StorageEntryIdentifier
result
=
new
_StorageEntryIdentifier
();
_StorageEntryIdentifier
result
=
new
_StorageEntryIdentifier
();
...
@@ -62,15 +66,22 @@ class PageStorageBucket {
...
@@ -62,15 +66,22 @@ class PageStorageBucket {
}
}
Map
<
_StorageEntryIdentifier
,
dynamic
>
_storage
;
Map
<
_StorageEntryIdentifier
,
dynamic
>
_storage
;
/// Write the given data into this page storage bucket using an identifier
/// computed from the given context.
void
writeState
(
BuildContext
context
,
dynamic
data
)
{
void
writeState
(
BuildContext
context
,
dynamic
data
)
{
_storage
??=
<
_StorageEntryIdentifier
,
dynamic
>{};
_storage
??=
<
_StorageEntryIdentifier
,
dynamic
>{};
_storage
[
_computeStorageIdentifier
(
context
)]
=
data
;
_storage
[
_computeStorageIdentifier
(
context
)]
=
data
;
}
}
/// Read given data from into this page storage bucket using an identifier
/// computed from the given context.
dynamic
readState
(
BuildContext
context
)
{
dynamic
readState
(
BuildContext
context
)
{
return
_storage
!=
null
?
_storage
[
_computeStorageIdentifier
(
context
)]
:
null
;
return
_storage
!=
null
?
_storage
[
_computeStorageIdentifier
(
context
)]
:
null
;
}
}
}
}
/// Establishes a page storage bucket for this widget subtree.
class
PageStorage
extends
StatelessComponent
{
class
PageStorage
extends
StatelessComponent
{
PageStorage
({
PageStorage
({
Key
key
,
Key
key
,
...
@@ -79,6 +90,8 @@ class PageStorage extends StatelessComponent {
...
@@ -79,6 +90,8 @@ class PageStorage extends StatelessComponent {
})
:
super
(
key:
key
);
})
:
super
(
key:
key
);
final
Widget
child
;
final
Widget
child
;
/// The page storage bucket to use for this subtree.
final
PageStorageBucket
bucket
;
final
PageStorageBucket
bucket
;
/// The bucket from the closest instance of this class that encloses the given context.
/// The bucket from the closest instance of this class that encloses the given context.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment