Add some more documentation. (#14717)
diff --git a/packages/flutter/lib/src/cupertino/picker.dart b/packages/flutter/lib/src/cupertino/picker.dart
index 2f18d6f..69ae7ed 100644
--- a/packages/flutter/lib/src/cupertino/picker.dart
+++ b/packages/flutter/lib/src/cupertino/picker.dart
@@ -29,6 +29,14 @@
/// the iOS design specific chrome.
/// * <https://developer.apple.com/ios/human-interface-guidelines/controls/pickers/>
class CupertinoPicker extends StatefulWidget {
+ /// Creates a control used for selecting values.
+ ///
+ /// The [diameterRatio] and [itemExtent] arguments must not be null. The
+ /// [itemExtent] must be greater than zero.
+ ///
+ /// The [backgroundColor] defaults to light gray. It can be set to null to
+ /// disable the background painting entirely; this is mildly more efficient
+ /// than using [Colors.transparent].
const CupertinoPicker({
Key key,
this.diameterRatio: _kDefaultDiameterRatio,
@@ -55,6 +63,9 @@
/// Background color behind the children.
///
/// Defaults to a gray color in the iOS color palette.
+ ///
+ /// This can be set to null to disable the background painting entirely; this
+ /// is mildly more efficient than using [Colors.transparent].
final Color backgroundColor;
/// A [FixedExtentScrollController] to read and control the current item.
@@ -164,26 +175,30 @@
@override
Widget build(BuildContext context) {
- return new DecoratedBox(
- decoration: new BoxDecoration(
- color: widget.backgroundColor,
- ),
- child: new Stack(
- children: <Widget>[
- new Positioned.fill(
- child: new ListWheelScrollView(
- controller: widget.scrollController,
- physics: const FixedExtentScrollPhysics(),
- diameterRatio: widget.diameterRatio,
- itemExtent: widget.itemExtent,
- onSelectedItemChanged: _handleSelectedItemChanged,
- children: widget.children,
- ),
+ Widget result = new Stack(
+ children: <Widget>[
+ new Positioned.fill(
+ child: new ListWheelScrollView(
+ controller: widget.scrollController,
+ physics: const FixedExtentScrollPhysics(),
+ diameterRatio: widget.diameterRatio,
+ itemExtent: widget.itemExtent,
+ onSelectedItemChanged: _handleSelectedItemChanged,
+ children: widget.children,
),
- _buildGradientScreen(),
- _buildMagnifierScreen(),
- ],
- ),
+ ),
+ _buildGradientScreen(),
+ _buildMagnifierScreen(),
+ ],
);
+ if (widget.backgroundColor != null) {
+ result = new DecoratedBox(
+ decoration: new BoxDecoration(
+ color: widget.backgroundColor,
+ ),
+ child: result,
+ );
+ }
+ return result;
}
}
diff --git a/packages/flutter/lib/src/material/scaffold.dart b/packages/flutter/lib/src/material/scaffold.dart
index d1f0942..1c977e5 100644
--- a/packages/flutter/lib/src/material/scaffold.dart
+++ b/packages/flutter/lib/src/material/scaffold.dart
@@ -37,12 +37,13 @@
statusBar,
}
-/// Geometry information for scaffold components.
+/// Geometry information for [Scaffold] components.
///
-/// To get a [ValueNotifier] for the scaffold geometry call
-/// [Scaffold.geometryOf].
+/// To get a [ValueNotifier] for the scaffold geometry of a given
+/// [BuildContext], use [Scaffold.geometryOf].
@immutable
class ScaffoldGeometry {
+ /// Create an object that describes the geometry of a [Scaffold].
const ScaffoldGeometry({
this.bottomNavigationBarTop,
this.floatingActionButtonArea,
diff --git a/packages/flutter/lib/src/semantics/semantics.dart b/packages/flutter/lib/src/semantics/semantics.dart
index 079740d..c078a53 100644
--- a/packages/flutter/lib/src/semantics/semantics.dart
+++ b/packages/flutter/lib/src/semantics/semantics.dart
@@ -1076,8 +1076,8 @@
/// platform's accessibility services (e.g. VoiceOver on iOS and TalkBack on
/// Android). This is used to determine the [nextNodeId] and [previousNodeId]
/// during a semantics update.
- SemanticsSortOrder _sortOrder;
SemanticsSortOrder get sortOrder => _sortOrder;
+ SemanticsSortOrder _sortOrder;
/// The ID of the next node in the traversal order after this node.
///
@@ -1089,6 +1089,7 @@
/// If this is set to -1, it will indicate that there is no next node to
/// the engine (i.e. this is the last node in the sort order). When it is
/// null, it means that no semantics update has been built yet.
+ int get nextNodeId => _nextNodeId;
int _nextNodeId;
void _updateNextNodeId(int value) {
if (value == _nextNodeId)
@@ -1096,7 +1097,6 @@
_nextNodeId = value;
_markDirty();
}
- int get nextNodeId => _nextNodeId;
/// The ID of the previous node in the traversal order before this node.
///
@@ -1108,6 +1108,7 @@
/// If this is set to -1, it will indicate that there is no previous node to
/// the engine (i.e. this is the first node in the sort order). When it is
/// null, it means that no semantics update has been built yet.
+ int get previousNodeId => _previousNodeId;
int _previousNodeId;
void _updatePreviousNodeId(int value) {
if (value == _previousNodeId)
@@ -1115,7 +1116,6 @@
_previousNodeId = value;
_markDirty();
}
- int get previousNodeId => _previousNodeId;
/// The currently selected text (or the position of the cursor) within [value]
/// if this node represents a text field.
@@ -2681,26 +2681,30 @@
/// [SemanticsSortOrder] manages.
/// * [OrdinalSortKey] for a sort key that sorts using an ordinal.
class SemanticsSortOrder extends Diagnosticable implements Comparable<SemanticsSortOrder> {
+ /// Creates an object that describes the sort order for a [Semantics] widget.
+ ///
/// Only one of `key` or `keys` may be specified, but at least one must
/// be specified. Specifying `key` is a shorthand for specifying
- /// `keys = <SemanticsSortKey>[key]`.
+ /// `keys: <SemanticsSortKey>[key]`.
///
- /// If [discardParentOrder] is set to true, then the
- /// [SemanticsSortOrder.keys] will replace the list of keys from the parents
- /// when merged, instead of extending them.
+ /// If [discardParentOrder] is set to true, then the [SemanticsSortOrder.keys]
+ /// will _replace_ the list of keys from the parents when merged, instead of
+ /// extending them.
SemanticsSortOrder({
SemanticsSortKey key,
List<SemanticsSortKey> keys,
this.discardParentOrder = false,
- })
- : assert(key != null || keys != null, 'One of key or keys must be specified.'),
- assert(key == null || keys == null, 'Only one of key or keys may be specified.'),
- keys = key == null ? keys : <SemanticsSortKey>[key];
+ }) : assert(key != null || keys != null, 'One of key or keys must be specified.'),
+ assert(key == null || keys == null, 'Only one of key or keys may be specified.'),
+ keys = key == null ? keys : <SemanticsSortKey>[key];
/// Whether or not this order is to replace the keys above it in the
/// semantics tree, or to be appended to them.
final bool discardParentOrder;
+ /// The keys that should be used to sort this node.
+ ///
+ /// Typically only one key is provided, using the constructor's `key` argument.
final List<SemanticsSortKey> keys;
/// Merges two sort orders by concatenating their sort key lists. If
@@ -2763,6 +2767,8 @@
/// * [SemanticsSortOrder] which manages a list of sort keys.
/// * [OrdinalSortKey] for a sort key that sorts using an ordinal.
abstract class SemanticsSortKey extends Diagnosticable implements Comparable<SemanticsSortKey> {
+ /// Abstract const constructor. This constructor enables subclasses to provide
+ /// const constructors so that they can be used in const expressions.
const SemanticsSortKey({this.name});
/// An optional name that will make this sort key only order itself
@@ -2774,14 +2780,21 @@
@override
int compareTo(SemanticsSortKey other) {
- if (other.runtimeType != runtimeType || other.name != name) {
+ if (other.runtimeType != runtimeType || other.name != name)
return 0;
- }
return doCompare(other);
}
+ /// The implementation of [compareTo].
+ ///
+ /// The argument is guaranteed to be the same type as this object.
+ ///
+ /// The method should return a negative number of this object is earlier in
+ /// the sort order than the argument; and a positive number if it comes later
+ /// in the sort order. Returning zero causes the system to default to
+ /// comparing the geometry of the nodes.
@protected
- int doCompare(SemanticsSortKey other);
+ int doCompare(covariant SemanticsSortKey other);
@override
void debugFillProperties(DiagnosticPropertiesBuilder description) {
@@ -2790,30 +2803,40 @@
}
}
-/// A [SemanticsSortKey] that sorts simply based on the ordinal given it.
+/// A [SemanticsSortKey] that sorts simply based on the `double` value it is
+/// given.
///
/// The [OrdinalSortKey] compares itself with other [OrdinalSortKey]s
/// to sort based on the order it is given.
///
+/// The ordinal value `order` is typically an integer, though it can be
+/// fractional, e.g. in order to fit between two other consecutive integers. The
+/// value must be finite (it cannot be a NaN value or infinity).
+///
/// See also:
///
/// * [SemanticsSortOrder] which manages a list of sort keys.
class OrdinalSortKey extends SemanticsSortKey {
- const OrdinalSortKey(this.order, {String name}) : super(name: name);
+ /// Creates a semantics sort key that uses a double as its key value.
+ ///
+ /// The [order] must be a finite number.
+ const OrdinalSortKey(
+ this.order, {
+ String name,
+ }) : assert(order != null),
+ assert(order > double.NEGATIVE_INFINITY),
+ assert(order < double.INFINITY),
+ super(name: name);
- /// [order] is a double which describes the order in which this node
- /// is traversed by the platform's accessibility services. Lower values
- /// will be traversed first.
+ /// A double which describes the order in which this node is traversed by the
+ /// platform's accessibility services. Lower values will be traversed first.
final double order;
@override
- int doCompare(SemanticsSortKey other) {
- assert(other.runtimeType == runtimeType);
- final OrdinalSortKey otherOrder = other;
- if (otherOrder.order == null || order == null || otherOrder.order == order) {
+ int doCompare(OrdinalSortKey other) {
+ if (other.order == null || order == null || other.order == order)
return 0;
- }
- return order.compareTo(otherOrder.order);
+ return order.compareTo(other.order);
}
@override
diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index a1a81b6..6aa1544 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -1869,10 +1869,11 @@
/// (directly or indirectly) from build methods, layout and paint callbacks, or
/// from [State.didChangeDependencies].
///
- /// This method should not be called from [State.deactivate] or [State.dispose]
- /// because the element tree is no longer stable at that time. To refer to
- /// an ancestor from one of those methods, save a reference to the ancestor
- /// in [State.didChangeDependencies].
+ /// This method should not be called from [State.dispose] because the element
+ /// tree is no longer stable at that time. To refer to an ancestor from that
+ /// method, save a reference to the ancestor in [State.didChangeDependencies].
+ /// It is safe to use this method from [State.deactivate], which is called
+ /// whenever the widget is removed from the tree.
///
/// It is also possible to call this from interaction event handlers (e.g.
/// gesture callbacks) or timers, to obtain a value once, if that value is not
@@ -1896,10 +1897,12 @@
/// This method does not establish a relationship with the target in the way
/// that [inheritFromWidgetOfExactType] does.
///
- /// This method should not be called from [State.deactivate] or [State.dispose]
- /// because the element tree is no longer stable at that time. To refer to
- /// an ancestor from one of those methods, save a reference to the ancestor
- /// by calling [inheritFromWidgetOfExactType] in [State.didChangeDependencies].
+ /// This method should not be called from [State.dispose] because the element
+ /// tree is no longer stable at that time. To refer to an ancestor from that
+ /// method, save a reference to the ancestor by calling
+ /// [inheritFromWidgetOfExactType] in [State.didChangeDependencies]. It is
+ /// safe to use this method from [State.deactivate], which is called whenever
+ /// the widget is removed from the tree.
InheritedElement ancestorInheritedElementForWidgetOfExactType(Type targetType);
/// Returns the nearest ancestor widget of the given type, which must be the
@@ -1918,7 +1921,7 @@
/// This method should not be called from [State.deactivate] or [State.dispose]
/// because the widget tree is no longer stable at that time. To refer to
/// an ancestor from one of those methods, save a reference to the ancestor
- /// by calling [inheritFromWidgetOfExactType] in [State.didChangeDependencies].
+ /// by calling [ancestorWidgetOfExactType] in [State.didChangeDependencies].
Widget ancestorWidgetOfExactType(Type targetType);
/// Returns the [State] object of the nearest ancestor [StatefulWidget] widget
@@ -1944,12 +1947,14 @@
/// This method should not be called from [State.deactivate] or [State.dispose]
/// because the widget tree is no longer stable at that time. To refer to
/// an ancestor from one of those methods, save a reference to the ancestor
- /// by calling [inheritFromWidgetOfExactType] in [State.didChangeDependencies].
+ /// by calling [ancestorStateOfType] in [State.didChangeDependencies].
///
- /// Example:
+ /// ## Sample code
///
/// ```dart
- /// context.ancestorStateOfType(const TypeMatcher<ScrollableState>());
+ /// ScrollableState scrollable = context.ancestorStateOfType(
+ /// const TypeMatcher<ScrollableState>(),
+ /// );
/// ```
State ancestorStateOfType(TypeMatcher matcher);
@@ -1975,14 +1980,14 @@
/// it is used by [Material] so that [InkWell] widgets can trigger the ink
/// splash on the [Material]'s actual render object.
///
- /// This method should not be called from [State.deactivate] or [State.dispose]
- /// because the widget tree is no longer stable at that time. To refer to
- /// an ancestor from one of those methods, save a reference to the ancestor
- /// by calling [inheritFromWidgetOfExactType] in [State.didChangeDependencies].
- ///
/// Calling this method is relatively expensive (O(N) in the depth of the
/// tree). Only call this method if the distance from this widget to the
/// desired ancestor is known to be small and bounded.
+ ///
+ /// This method should not be called from [State.deactivate] or [State.dispose]
+ /// because the widget tree is no longer stable at that time. To refer to
+ /// an ancestor from one of those methods, save a reference to the ancestor
+ /// by calling [ancestorRenderObjectOfType] in [State.didChangeDependencies].
RenderObject ancestorRenderObjectOfType(TypeMatcher matcher);
/// Walks the ancestor chain, starting with the parent of this build context's
@@ -1998,7 +2003,7 @@
/// This method should not be called from [State.deactivate] or [State.dispose]
/// because the element tree is no longer stable at that time. To refer to
/// an ancestor from one of those methods, save a reference to the ancestor
- /// by calling [inheritFromWidgetOfExactType] in [State.didChangeDependencies].
+ /// by calling [visitAncestorElements] in [State.didChangeDependencies].
void visitAncestorElements(bool visitor(Element element));
/// Walks the children of this widget.
diff --git a/packages/flutter/test/widgets/custom_painter_test.dart b/packages/flutter/test/widgets/custom_painter_test.dart
index dd657d1..b3da2ae 100644
--- a/packages/flutter/test/widgets/custom_painter_test.dart
+++ b/packages/flutter/test/widgets/custom_painter_test.dart
@@ -347,8 +347,6 @@
),
));
- debugDumpSemanticsTree(DebugSemanticsDumpOrder.inverseHitTest);
-
final Set<SemanticsAction> allActions = SemanticsAction.values.values.toSet()
..remove(SemanticsAction.showOnScreen); // showOnScreen is non user-exposed.
@@ -656,8 +654,9 @@
firstChild.visitChildren((SemanticsNode node) {
if (node.key != null && idAssignments[node.key] != null) {
expect(idAssignments[node.key], node.id, reason:
- 'Node with key ${node.key} was previously assigned id ${idAssignments[node.key]}. '
- 'After diffing the child list, its id changed to ${node.id}. Ids must be stable.');
+ 'Node with key ${node.key} was previously assigned ID ${idAssignments[node.key]}. '
+ 'After diffing the child list, its ID changed to ${node.id}. IDs must be stable.'
+ );
}
return true;
});