Ответ 1
Ваш первый скриншот показывает, что он работает просто отлично - проблема в том, что "отлично" не совсем то, что вы ожидаете. Цвет текста по умолчанию - белый для вкладки, так что ваши ярлыки не отображаются, а только нижняя строка, что вы видите в левом верхнем углу. Кроме того, TabBar уже является виджетом предпочтительного размера, но он не имеет ту же высоту, что и панель приложений, поэтому, если вы этого хотите, он не будет выглядеть так.
Вот пример, который делает его похожим на панель приложения. kToolbarHeight
- это та же константа, которую использует AppBar.
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
State<StatefulWidget> createState() => new MyAppState();
}
class MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'msc',
home: new DefaultTabController(
length: 2,
child: new Scaffold(
appBar: new PreferredSize(
preferredSize: Size.fromHeight(kToolbarHeight),
child: new Container(
color: Colors.green,
child: new SafeArea(
child: Column(
children: <Widget>[
new Expanded(child: new Container()),
new TabBar(
tabs: [new Text("Lunches"), new Text("Cart")],
),
],
),
),
),
),
body: new TabBarView(
children: <Widget>[
new Column(
children: <Widget>[new Text("Lunches Page")],
),
new Column(
children: <Widget>[new Text("Cart Page")],
)
],
),
),
),
);
}
}
Что приводит к этому:
Изменить:
Как отмечено в комментариях и из этой проблемы с github, вы также можете использовать свойство FlexibleSpace AppBar, чтобы удерживать панель вкладок в основном таким же образом:
return new DefaultTabController(
length: 3,
child: new Scaffold(
appBar: new AppBar(
flexibleSpace: new Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
new TabBar(
tabs: [
new Tab(icon: new Icon(Icons.directions_car)),
new Tab(icon: new Icon(Icons.directions_transit)),
new Tab(icon: new Icon(Icons.directions_bike)),
],
),
],
),
),
),
);