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

完成圖如下:

完成圖

很簡單吧!

下次見囉!

相关推荐
心中有国也有家8 小时前
AtomGit Flutter 鸿蒙客户端:ModalBottomSheet 实战
android·javascript·学习·flutter·华为·harmonyos
千逐6812 小时前
React Native 性能优化深度解析:从原理到实战
flutter·华为·鸿蒙
帅次14 小时前
Android 高级工程师面试:Flutter Widget 体系 近1年高频追问 20 题
android·flutter·面试·element·widget·setstate·renderobject
浮江雾18 小时前
Flutter第四节------核心概念学习笔记:从基础语法到异步编程
linux·服务器·开发语言·笔记·flutter·入门·基础
心中有国也有家19 小时前
AtomGit Flutter 鸿蒙客户端:Flutter 鸿蒙应用的错误处理与优雅降级策略
学习·flutter·华为·harmonyos
心中有国也有家1 天前
AtomGit Flutter 鸿蒙客户端: ChangeNotifier 模式
学习·flutter·华为·harmonyos
浮江雾2 天前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数
又菜又爱coding2 天前
Flutter Android 无线调试No supported devices connected
flutter
心中有国也有家2 天前
AtomGit Flutter 鸿蒙客户端:初始化流水线
学习·flutter·华为·harmonyos
ZZZMMM.zip2 天前
基于鸿蒙HarmonyOS NEXT开发AI英语口语应用:智能口语练习新体验与鸿蒙Flutter框架跨端实
人工智能·flutter·华为·harmonyos·鸿蒙·鸿蒙系统