|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- import 'package:flutter/material.dart';
- import 'package:flutter/rendering.dart';
-
- const double _kTabHeight = 46.0;
- const double _kTextAndIconTabHeight = 40.0;
-
- /// A material design [TabBar] tab.
- ///
- /// If both [icon] and [text] are provided, the text is displayed below
- /// the icon.
- ///
- /// See also:
- ///
- /// * [TabBar], which displays a row of tabs.
- /// * [TabBarView], which displays a widget for the currently selected tab.
- /// * [TabController], which coordinates tab selection between a [TabBar] and a [TabBarView].
- /// * <https://material.io/design/components/tabs.html>
- class MyTab extends StatelessWidget {
- /// Creates a material design [TabBar] tab.
- ///
- /// At least one of [text], [icon], and [child] must be non-null. The [text]
- /// and [child] arguments must not be used at the same time.
- const MyTab({
- Key key,
- this.text,
- this.icon,
- this.child,
- }) : assert(text != null || child != null || icon != null),
- assert(!(text != null && null != child)),
- // TODO(goderbauer): https://github.com/dart-lang/sdk/issues/34180
- super(key: key);
-
- /// The text to display as the tab's label.
- ///
- /// Must not be used in combination with [child].
- final String text;
-
- /// The widget to be used as the tab's label.
- ///
- /// Usually a [Text] widget, possibly wrapped in a [Semantics] widget.
- ///
- /// Must not be used in combination with [text].
- final Widget child;
-
- /// An icon to display as the tab's label.
- final Widget icon;
-
- Widget _buildLabelText() {
- return child ?? Text(text, softWrap: false, overflow: TextOverflow.fade);
- }
-
- @override
- Widget build(BuildContext context) {
- assert(debugCheckHasMaterial(context));
-
- double height;
- Widget label;
- if (icon == null) {
- height = _kTabHeight;
- label = _buildLabelText();
- } else if (text == null && child == null) {
- height = _kTabHeight;
- label = icon;
- } else {
- height = _kTextAndIconTabHeight;
- label = Row(
- children: <Widget>[
- Container(child: icon, margin: const EdgeInsets.only(right: 5),),
- _buildLabelText(),
- ],
- );
- }
-
- return SizedBox(
- height: height,
- child: Center(
- child: label,
- widthFactor: 1.0,
- ),
- );
- }
-
- }
|