В Flutter вы можете достичь желаемого результата, сделав кнопки в TabBar шириной текста внутри, используя TabBar и TabBarView совместно с TabController и TabBarIndicatorSize.
Прежде всего, вам потребуется импортировать необходимые классы:
import 'package:flutter/material.dart';
Затем вам потребуется объявить и инициализировать экземпляр TabController внутри вашего виджета, который будет контролировать индексы выбранных вкладок:
TabController _tabController;
Далее, вам нужно создать список объектов Tab, каждый из которых представляет собой вкладку с текстом внутри кнопки. Каждой вкладке будет соответствовать содержимое, которое будет отображаться на экране. Например:
final List<Tab> myTabs = <Tab>[ Tab(text: 'Вкладка 1'), Tab(text: 'Вкладка 2'), Tab(text: 'Вкладка 3'), ];
Теперь вы можете создать экземпляр TabBar и TabBarView и указать им использовать определенный TabController:
TabBar( controller: _tabController, tabs: myTabs, )
TabBarView( controller: _tabController, children: <Widget>[ // Содержимое для первой вкладки Container( child: Text('Содержимое первой вкладки'), ), // Содержимое для второй вкладки Container( child: Text('Содержимое второй вкладки'), ), // Содержимое для третьей вкладки Container( child: Text('Содержимое третьей вкладки'), ), ], )
Наконец, вам необходимо инициализировать TabController и добавить его в метод initState вашего виджета:
@override void initState() { _tabController = TabController(length: myTabs.length, vsync: this); super.initState(); }
Также не забудьте добавить dispose метод, чтобы освободить ресурсы при удалении вашего виджета:
@override void dispose() { _tabController.dispose(); super.dispose(); }
Полный пример использования TabBar и TabBarView с кнопками шириной текста внутри выглядит следующим образом:
import 'package:flutter/material.dart'; class MyTabbedPage extends StatefulWidget { @override _MyTabbedPageState createState() => _MyTabbedPageState(); } class _MyTabbedPageState extends State<MyTabbedPage> with SingleTickerProviderStateMixin { TabController _tabController; final List<Tab> myTabs = <Tab>[ Tab(text: 'Вкладка 1'), Tab(text: 'Вкладка 2'), Tab(text: 'Вкладка 3'), ]; @override void initState() { _tabController = TabController(length: myTabs.length, vsync: this); super.initState(); } @override void dispose() { _tabController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Пример TabBar'), bottom: TabBar( controller: _tabController, tabs: myTabs, isScrollable: true, ), ), body: TabBarView( controller: _tabController, children: <Widget>[ Container( child: Text('Содержимое первой вкладки'), ), Container( child: Text('Содержимое второй вкладки'), ), Container( child: Text('Содержимое третьей вкладки'), ), ], ), ); } } void main() { runApp(MaterialApp( home: MyTabbedPage(), )); }
Таким образом, используя TabBar и TabBarView с TabController и TabBarIndicatorSize, вы можете создать кнопки в TabBar ширина которых будет соответствовать ширине текста внутри.