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]. /// * 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: [ Container(child: icon, margin: const EdgeInsets.only(right: 5),), _buildLabelText(), ], ); } return SizedBox( height: height, child: Center( child: label, widthFactor: 1.0, ), ); } }