Document progress indicators

Specifically, explain how to create both determinate and indeterminate progress

indicators.



Fixes #3055
diff --git a/packages/flutter/lib/src/material/progress_indicator.dart b/packages/flutter/lib/src/material/progress_indicator.dart
index ec6da26..c5c6d47 100644
--- a/packages/flutter/lib/src/material/progress_indicator.dart
+++ b/packages/flutter/lib/src/material/progress_indicator.dart
@@ -14,13 +14,34 @@
 
 // TODO(hansmuller): implement the support for buffer indicator
 
+/// A base class for material design progress indicators
+///
+/// This widget cannot be instantiated directly. For a linear progress
+/// indicator, see [LinearProgressIndicator]. For a circular progress indicator,
+/// see [CircularProgressIndicator].
+///
+/// See also:
+///
+///  * <https://www.google.com/design/spec/components/progress-activity.html>
 abstract class ProgressIndicator extends StatefulWidget {
+  /// Creates a progress indicator.
+  ///
+  /// The [value] argument can be either null (corresponding to an indeterminate
+  /// progress indcator) or non-null (corresponding to a determinate progress
+  /// indicator). See [value] for details.
   ProgressIndicator({
     Key key,
     this.value
   }) : super(key: key);
 
-  final double value; // Null for non-determinate progress indicator.
+  /// If non-null, the value of this progress indicator with 0.0 corresponding
+  /// to no progress having been made and 1.0 corresponding to all the progress
+  /// having been made.
+  ///
+  /// If null, this progress indicator is indeterminate, which means the
+  /// indicator displays a predetermined animation that does not indicator how
+  /// much actual progress is being made.
+  final double value;
 
   Color _getBackgroundColor(BuildContext context) => Theme.of(context).backgroundColor;
   Color _getValueColor(BuildContext context) => Theme.of(context).primaryColor;
@@ -74,7 +95,30 @@
   }
 }
 
+/// A material design linear progress indicator.
+///
+/// A widget that shows progress along a line. There are two kinds of linear
+/// progress indicators:
+///
+///  * _Determinate_. Determinate progress indicators have a specific value at
+///    each point in time, and the value should increase monotonically from 0.0
+///    to 1.0, at which time the indicator is complete. To create a determinate
+///    progress indicator, use a non-null [value] between 0.0 and 1.0.
+///  * _Indeterminate_. Indeterminate progress indicators do not have a specific
+///    value at each point in time and instead indicate that progress is being
+///    made without indicating how much progress remains. To create an
+///    indeterminate progress indicator, use a null [value].
+///
+/// See also:
+///
+///  * [CircularProgressIndicator]
+///  * <https://www.google.com/design/spec/components/progress-activity.html#progress-activity-types-of-indicators>
 class LinearProgressIndicator extends ProgressIndicator {
+  /// Creates a linear progress indicator.
+  ///
+  /// The [value] argument can be either null (corresponding to an indeterminate
+  /// progress indcator) or non-null (corresponding to a determinate progress
+  /// indicator). See [value] for details.
   LinearProgressIndicator({
     Key key,
     double value
@@ -172,7 +216,7 @@
       canvas.drawPath(path, paint);
 
     } else {
-      // Non-determinate
+      // Indeterminate
       paint.strokeCap = StrokeCap.square;
 
       double arcSweep = math.max(headValue * 3 / 2 * math.PI - tailValue * 3 / 2 * math.PI, _kEpsilon);
@@ -196,7 +240,30 @@
   }
 }
 
+/// A material design circular progress indicator.
+///
+/// A widget that shows progress along a circle. There are two kinds of circular
+/// progress indicators:
+///
+///  * _Determinate_. Determinate progress indicators have a specific value at
+///    each point in time, and the value should increase monotonically from 0.0
+///    to 1.0, at which time the indicator is complete. To create a determinate
+///    progress indicator, use a non-null [value] between 0.0 and 1.0.
+///  * _Indeterminate_. Indeterminate progress indicators do not have a specific
+///    value at each point in time and instead indicate that progress is being
+///    made without indicating how much progress remains. To create an
+///    indeterminate progress indicator, use a null [value].
+///
+/// See also:
+///
+///  * [LinearProgressIndicator]
+///  * <https://www.google.com/design/spec/components/progress-activity.html#progress-activity-types-of-indicators>
 class CircularProgressIndicator extends ProgressIndicator {
+  /// Creates a circular progress indicator.
+  ///
+  /// The [value] argument can be either null (corresponding to an indeterminate
+  /// progress indcator) or non-null (corresponding to a determinate progress
+  /// indicator). See [value] for details.
   CircularProgressIndicator({
     Key key,
     double value