| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:flutter/widgets.dart'; |
| |
| import 'chip.dart'; |
| import 'debug.dart'; |
| import 'theme_data.dart'; |
| |
| /// A Material Design action chip. |
| /// |
| /// Action chips are a set of options which trigger an action related to primary |
| /// 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. 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, [ElevatedButton], [TextButton], and |
| /// [OutlinedButton], 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. |
| /// |
| /// {@tool snippet} |
| /// |
| /// ```dart |
| /// ActionChip( |
| /// avatar: CircleAvatar( |
| /// backgroundColor: Colors.grey.shade800, |
| /// child: const Text('AB'), |
| /// ), |
| /// label: const Text('Aaron Burr'), |
| /// onPressed: () { |
| /// print('If you stand for nothing, Burr, what’ll you fall for?'); |
| /// } |
| /// ) |
| /// ``` |
| /// {@end-tool} |
| /// |
| /// See also: |
| /// |
| /// * [Chip], a chip that displays information and can be deleted. |
| /// * [InputChip], a chip that represents a complex piece of information, such |
| /// as an entity (person, place, or thing) or conversational text, in a |
| /// compact form. |
| /// * [ChoiceChip], allows a single selection from a set of options. Choice |
| /// chips contain related descriptive text or categories. |
| /// * [CircleAvatar], which shows images or initials of people. |
| /// * [Wrap], A widget that displays its children in multiple horizontal or |
| /// vertical runs. |
| /// * <https://material.io/design/components/chips.html> |
| class ActionChip extends StatelessWidget implements ChipAttributes, TappableChipAttributes { |
| /// Create a chip that acts like a button. |
| /// |
| /// The [label], [onPressed], [autofocus], and [clipBehavior] arguments must |
| /// not be null. The [pressElevation] and [elevation] must be null or |
| /// non-negative. Typically, [pressElevation] is greater than [elevation]. |
| const ActionChip({ |
| super.key, |
| this.avatar, |
| required this.label, |
| this.labelStyle, |
| this.labelPadding, |
| required this.onPressed, |
| this.pressElevation, |
| this.tooltip, |
| this.side, |
| this.shape, |
| this.clipBehavior = Clip.none, |
| this.focusNode, |
| this.autofocus = false, |
| this.backgroundColor, |
| this.padding, |
| this.visualDensity, |
| this.materialTapTargetSize, |
| this.elevation, |
| this.shadowColor, |
| }) : assert(label != null), |
| assert(clipBehavior != null), |
| assert(autofocus != null), |
| assert( |
| onPressed != null, |
| 'Rather than disabling an ActionChip by setting onPressed to null, ' |
| 'remove it from the interface entirely.', |
| ), |
| assert(pressElevation == null || pressElevation >= 0.0), |
| assert(elevation == null || elevation >= 0.0); |
| |
| @override |
| final Widget? avatar; |
| @override |
| final Widget label; |
| @override |
| final TextStyle? labelStyle; |
| @override |
| final EdgeInsetsGeometry? labelPadding; |
| @override |
| final VoidCallback onPressed; |
| @override |
| final double? pressElevation; |
| @override |
| final String? tooltip; |
| @override |
| final BorderSide? side; |
| @override |
| final OutlinedBorder? shape; |
| @override |
| final Clip clipBehavior; |
| @override |
| final FocusNode? focusNode; |
| @override |
| final bool autofocus; |
| @override |
| final Color? backgroundColor; |
| @override |
| final EdgeInsetsGeometry? padding; |
| @override |
| final VisualDensity? visualDensity; |
| @override |
| final MaterialTapTargetSize? materialTapTargetSize; |
| @override |
| final double? elevation; |
| @override |
| final Color? shadowColor; |
| |
| @override |
| Widget build(BuildContext context) { |
| assert(debugCheckHasMaterial(context)); |
| return RawChip( |
| avatar: avatar, |
| label: label, |
| onPressed: onPressed, |
| pressElevation: pressElevation, |
| tooltip: tooltip, |
| labelStyle: labelStyle, |
| backgroundColor: backgroundColor, |
| side: side, |
| shape: shape, |
| clipBehavior: clipBehavior, |
| focusNode: focusNode, |
| autofocus: autofocus, |
| padding: padding, |
| visualDensity: visualDensity, |
| labelPadding: labelPadding, |
| materialTapTargetSize: materialTapTargetSize, |
| elevation: elevation, |
| shadowColor: shadowColor, |
| ); |
| } |
| } |