Flutter-將TabBar放在body裏面

Flutter-將TabBar放在body裏面

可愛吧

有時候我們會需要將TabBar放在body裡面來控制畫面的切換,但是官方教學卻只有教如何放在AppBar裏面,所以今天就來學學如何放在body裡面吧!

這些教學也會做成一個完整的專案放在GitHub上面。

在開始前,我們需要先將狀態列給隱藏掉,原因是現在的手機太多奇奇怪怪的螢幕了,取消掉對於看起來以及設計都會比較輕鬆一點。

ini 复制代码
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
 overlays: [SystemUiOverlay.bottom]);

這段程式碼會將狀態列隱藏,並顯示下方的按鈕。

vbnet 复制代码
debugShowCheckedModeBanner: false,

而這段會將debug的標誌給消掉,不然看著好礙眼XD

整個會長這樣:

php 复制代码
Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
        overlays: [SystemUiOverlay.bottom]);
    return MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }

狀態列便會顯示:

狀態列與debug 的banner都消失了,讚啦!

再來可以開始設計TabBar啦!

TabBar與TabBarView之間是用Controller來繫結的,而Flutter本身就有提供一個預設的widget 名字叫做DefaultTabController,只要將TabBar與TabBarView放在這個容器裡面便能直接使用囉!

或是可以自己建立一個Controller 來控制兩邊的狀態,在這個專案裡都會使用第二種方式來控制。

如果要使用第二種方式,就必須要在StatefulWidget後面加上

csharp 复制代码
with SingleTickerProviderStateMixin

全部會長這樣

scala 复制代码
class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  Widget build(BuildContext context) {
    ....
  }
}

再來建立一個TabController的變數

ini 复制代码
TabController? _tabBarController;

前面必須加上? 讓他能在初始化之前是null的狀態,不然會報錯。

再來就是在InitState裡面初始化TabController

scss 复制代码
  @override
  void initState() {
    super.initState();
    _tabBarController = TabController(length: 2, vsync: this);
  }

vsync 是動畫的切換,因此我們前面才需要加上with SingleTickerProviderStateMixin

而長度就是依照TabBar與TabBarView的數量去設定

全部會長這樣:

scala 复制代码
class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  TabController? _tabBarController;
  @override
  void initState() {
    super.initState();
    _tabBarController = TabController(length: 2, vsync: this);
  }

再來就可以開始寫TabBar啦!

less 复制代码
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        backgroundColor: Colors.blue,
      ),
      body: Container(
        decoration: const BoxDecoration(color: Colors.white),
        child: Column(
          children: [
            TabBar(
              controller: _tabBarController,
              labelColor: Colors.blue,
              unselectedLabelColor: Colors.black,
              tabs: [
                Tab(
                  text: 'test1',
                ),
                Tab(
                  text: 'test2',
                )
              ],
            ),
            Expanded(
              child: Container(
                decoration: BoxDecoration(
                    color: Colors.grey[200],
                    border: const Border(
                        top: BorderSide(color: Colors.grey, width: 0.5))),
                child: TabBarView(
                  controller: _tabBarController,
                  children: [
                    Center(
                      child: TextButton(
                        onPressed: () {},
                        child: const Text("aaa"),
                      ),
                    ),
                    Center(
                      child: TextButton(
                        onPressed: () {},
                        child: const Text("bbb"),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

TabBarView必須要放在Expanded裏面,讓他可以佔滿剩餘的全部版面。

完成圖如下:

完成圖

很簡單吧!

下次見囉!

相关推荐
恋猫de小郭19 小时前
Android CLI 支持 AI Agent 通过 Device Streaming 调试云真机
android·前端·flutter
m0_738185822 天前
Flutter 鸿蒙化实战:flutter_scankit 适配 OpenHarmony,华为 ScanKit 扫码
flutter·华为·harmonyos·鸿蒙
事圆则缓2 天前
Flutter 开发鸿蒙实战:从 OpenHarmony 适配版到 HAP 构建与插件接入
flutter·华为·harmonyos
天空之城--2 天前
Android一周动态:Android 18首次官宣、Compose Material3 1.4转正(5趋势+5资讯)
android·人工智能·flutter·架构·android jetpack
恋猫de小郭2 天前
Meta 分享怎么用 AI 迁移 Compose 项目不烧心
android·前端·flutter
EatFan2 天前
Flutter 鸿蒙适配实践 2026:从环境搭建、混合渲染到 OpenTelemetry 性能基建
flutter·华为·harmonyos·openharmony·opentelemetry·鸿蒙适配·impeller
m0_738185822 天前
Flutter 鸿蒙化实战:flutter_secure_storage 适配 OpenHarmony,敏感数据安全存储
安全·flutter·华为·harmonyos·鸿蒙
传奇开心果编程3 天前
【现代声明式UI学与练】第1课 从命令式UI到声明式UI
学习·flutter·ui·swiftui·react·android jetpack
m0_738185823 天前
Flutter 鸿蒙化实战:flutter_nfc_kit 适配 OpenHarmony,NFC 读写一步到位
flutter·华为·harmonyos·鸿蒙
恋猫de小郭3 天前
KMP 又改了编译流程, Separate Compilation 禁止了 `commonMain` 的依赖穿透
android·前端·flutter