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裏面,讓他可以佔滿剩餘的全部版面。

完成圖如下:

完成圖

很簡單吧!

下次見囉!

相关推荐
程序员老刘2 天前
跨平台开发地图 | 2026年6月
flutter·ai编程·客户端
悟空瞎说3 天前
Flutter 架构详解:新手必懂底层原理
flutter
SoaringHeart3 天前
Flutter最佳实践:IM聊天文字链接自动识别跳转
前端·flutter
恋猫de小郭3 天前
KMP / CMP 鸿蒙版本 Beta 发布,他有什么特别之处?
android·前端·flutter
风华圆舞4 天前
Flutter + 鸿蒙 Intents Kit:页面直达能力的完整接入方案
flutter·ui·华为·harmonyos
韩曙亮4 天前
【Flutter】Flutter 组件 ④ ( 组件渲染 的 三棵树理论 | Widget 树 → Element 树 → RenderObject 树 )
flutter·element·widget·renderobject
恋猫de小郭4 天前
Android 17 正式版发布,全新 AI 和各种破坏性更新
android·前端·flutter
kingbal4 天前
Windows:flutter环境搭建
windows·flutter
911hzh4 天前
Flutter MethodChannel 跨端通信框架 zh_native_channel:快速入门、优势分析与 Pigeon 对比
flutter
911hzh4 天前
Flutter 快速搭建新项目:用 Flutter Foundation Kit 一条命令生成带基础架构的 App 模板
flutter