diff --git a/packages/flutter/lib/src/material/chip.dart b/packages/flutter/lib/src/material/chip.dart index f933a76ffa..601a148e5e 100644 --- a/packages/flutter/lib/src/material/chip.dart +++ b/packages/flutter/lib/src/material/chip.dart @@ -64,6 +64,10 @@ const Icon _kDefaultDeleteIcon = const Icon(Icons.cancel, size: _kDeleteIconSize /// * [ActionChip], represents an action related to primary content. /// * abstract class ChipAttributes { + // This class is intended to be used as an interface, and should not be + // extended directly. + factory ChipAttributes._() => null; + /// The primary content of the chip. /// /// Typically a [Text] widget. @@ -121,6 +125,10 @@ abstract class ChipAttributes { /// compact form. /// * abstract class DeletableChipAttributes { + // This class is intended to be used as an interface, and should not be + // extended directly. + factory DeletableChipAttributes._() => null; + /// The icon displayed when [onDeleted] is set. /// /// Defaults to an [Icon] widget set to use [Icons.cancel]. @@ -212,6 +220,10 @@ abstract class DeletableChipAttributes { /// * [FilterChip], uses tags or descriptive words as a way to filter content. /// * abstract class SelectableChipAttributes { + // This class is intended to be used as an interface, and should not be + // extended directly. + factory SelectableChipAttributes._() => null; + /// Whether or not this chip is selected. /// /// If [onSelected] is not null, this value will be used to determine if the @@ -290,6 +302,10 @@ abstract class SelectableChipAttributes { /// * [FilterChip], uses tags or descriptive words as a way to filter content. /// * abstract class DisabledChipAttributes { + // This class is intended to be used as an interface, and should not be + // extended directly. + factory DisabledChipAttributes._() => null; + /// Whether or not this chip is enabled for input. /// /// If this is true, but all of the user action callbacks are null (i.e. @@ -333,6 +349,10 @@ abstract class DisabledChipAttributes { /// * [ActionChip], represents an action related to primary content. /// * abstract class TappableChipAttributes { + // This class is intended to be used as an interface, and should not be + // extended directly. + factory TappableChipAttributes._() => null; + /// Called when the user taps the chip. /// /// If [onPressed] is set, then this callback will be called when the user @@ -372,7 +392,7 @@ abstract class TappableChipAttributes { /// button for deleting the chip. /// /// Requires one of its ancestors to be a [Material] widget. The [label], -/// [deleteIcon] and [border] arguments must not be null. +/// [deleteIcon], and [border] arguments must not be null. /// /// ## Sample code /// @@ -402,7 +422,7 @@ abstract class TappableChipAttributes { class Chip extends StatelessWidget implements ChipAttributes, DeletableChipAttributes { /// Creates a material design chip. /// - /// The [label], [deleteIcon] and [border] arguments must not be null. + /// The [label], [deleteIcon], and [border] arguments must not be null. const Chip({ Key key, this.avatar, @@ -634,7 +654,7 @@ class InputChip extends StatelessWidget /// related descriptive text or categories. /// /// Requires one of its ancestors to be a [Material] widget. The [selected], -/// [label] and [border] arguments must not be null. +/// [label], and [border] arguments must not be null. /// /// ## Sample code /// @@ -684,6 +704,9 @@ class ChoiceChip extends StatelessWidget ChipAttributes, SelectableChipAttributes, DisabledChipAttributes { + /// Create a chip that acts like a radio button. + /// + /// The [selected], [label], and [border] arguments must not be null. const ChoiceChip({ Key key, this.avatar, @@ -849,6 +872,9 @@ class FilterChip extends StatelessWidget ChipAttributes, SelectableChipAttributes, DisabledChipAttributes { + /// Create a chip that acts like a checkbox. + /// + /// The [selected], [label], and [border] arguments must not be null. const FilterChip({ Key key, this.avatar, @@ -927,17 +953,19 @@ class FilterChip extends StatelessWidget /// content. Action chips should appear dynamically and contextually in a UI. /// /// Action chips can be tapped to trigger an action or show progress and -/// confirmation. +/// confirmation. They cannot be disabled; if the action is not applicable, the +/// chip should not be included in the interface. (This contrasts with buttons, +/// where unavailable choices are usually represented as disabled controls.) /// /// Action chips are displayed after primary content, such as below a card or /// persistently at the bottom of a screen. /// -/// The material button widgets, [RaisedButton], [FlatButton], [OutlineButton] -/// are an alternative to action chips, which should appear statically and -/// consistently in a UI. +/// The material button widgets, [RaisedButton], [FlatButton], and +/// [OutlineButton], are an alternative to action chips, which should appear +/// statically and consistently in a UI. /// /// Requires one of its ancestors to be a [Material] widget. The [onPressed], -/// [label] and [border] arguments must not be null. +/// [label], and [border] arguments must not be null. /// /// ## Sample code /// @@ -967,6 +995,9 @@ class FilterChip extends StatelessWidget /// vertical runs. /// * class ActionChip extends StatelessWidget implements ChipAttributes, TappableChipAttributes { + /// Create a chip that acts like a button. + /// + /// The [label], [border], and [onPressed] arguments must not be null. const ActionChip({ Key key, this.avatar, @@ -981,7 +1012,11 @@ class ActionChip extends StatelessWidget implements ChipAttributes, TappableChip this.padding, }) : assert(label != null), assert(shape != null), - assert(onPressed != null), + assert( + onPressed != null, + 'Rather than disabling an ActionChip by setting onPressed to null, ' + 'remove it from the interface entirely.', + ), super(key: key); @override