anchor.diff:  /// shows the currently selected item as well as an arrow that opens a menu for
   /// selecting another item.
   ///
  -/// The type `T` is the type of the values the dropdown menu represents. All the
  -/// entries in a given menu must represent values with consistent types.
  +/// The type `T` is the type of the [value] that each dropdown item represents.
  +/// All the entries in a given menu must represent values with consistent types.
   /// Typically, an enum is used. Each [DropdownMenuItem] in [items] must be
   /// specialized with that same type argument.
  +///
  +/// The [onChanged] callback should update a state variable that defines the
  +/// dropdown's value. It should also call [State.setState] to rebuild the
  +/// dropdown with the new value.
  +///
  +/// {@tool snippet --template=stateful_widget}
  +///
  +/// This sample shows a `DropdownButton` whose value is one of
  +/// "One", "Two", "Free", or "Four".
  +///
  +/// ```dart preamble
  +/// String dropdownValue = 'One';
  +/// ```
  +///
  +/// ```dart
  +/// Widget build(BuildContext context) {
  +///   return Scaffold(
  +///     body: Center(
  +///       child: DropdownButton<String>(
  +///         value: dropdownValue,
  +///         onChanged: (String newValue) {
  +///           setState(() {
  +///             dropdownValue = newValue;
  +///           });
  +///         },
  +///         items: <String>['One', 'Two', 'Free', 'Four']
  +///           .map<DropdownMenuItem<String>>((String value) {
  +///             return DropdownMenuItem<String>(
  +///               value: value,
  +///               child: Text(value),
  +///             );
  +///           })
  +///           .toList(),
  +///       ),
  +///     ),
  +///   );
  +/// }
  +/// ```
  +/// {@end-tool}
  +///
  +/// If the [onChanged] callback is null or the list of [items] is null
  +/// then the dropdown button will be disabled, i.e. its arrow will be
  +/// displayed in grey and it will not respond to input. A disabled button
  +/// will display the [disabledHint] widget if it is non-null.
   ///
   /// Requires one of its ancestors to be a [Material] widget.
   ///
  
positive.code:     this.isDense = false,
      this.isExpanded = false,
    }) : assert(items == null || value == null || items.where((DropdownMenuItem<T> item) => item.value == value).length == 1),
        super(key: key);
  
    /// The list of possible items to select among.
    final List<DropdownMenuItem<T>> items;
  
    /// The currently selected item, or null if no item has been selected. If
    /// value is null then the menu is popped up as if the first item was
    /// selected.
    final T value;
  
    /// Displayed if [value] is null.
  
negative.code: class DropdownButton<T> extends StatefulWidget {
    /// Creates a dropdown button.
    ///
    /// The [items] must have distinct values. If [value] isn't null then it
    /// must be equal to one of the [DropDownMenuItem] values. If [items] or
    /// [onChanged] is null, the button will be disabled, the down arrow
    /// will be greyed out, and the [disabledHint] will be shown (if provided).
    ///
    /// The [elevation] and [iconSize] arguments must not be null (they both have
    /// defaults, so do not need to be specified). The boolean [isDense] and
    /// [isExpanded] arguments must not be null.
    DropdownButton({
      Key key,
      @required this.items,
  