Как сделать кнопки в TabBar шириной текста внутри?

В 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 ширина которых будет соответствовать ширине текста внутри.