Flutter Ui 實驗室(五)Tabbar和其他按鈕在同一行

QQ群里有人問如下的效果怎么實現(xiàn)?大體就是Tabbar和其他按鈕怎么在同一行顯示,而且Tabbar的數(shù)量是根據(jù)服務器返回來確定的。


image.png

其實實現(xiàn)起來也很簡單,又是Row控件發(fā)揮作用的時候了。

首先,通過menu按鈕來模擬從服務器取得Tabbar的數(shù)量,沒有取得Tabbar的數(shù)量前,使用Container占位。


image.png

取得Tabbar的數(shù)量后,再構造Tabbar。

完整的代碼如下:

import 'package:flutter/material.dart';

class CustomTabbar extends StatefulWidget {
  @override
  _CustomTabbarState createState() => _CustomTabbarState();
}

class _CustomTabbarState extends State<CustomTabbar>
    with SingleTickerProviderStateMixin {
  TabController _tabController;
  bool _getDataFromServer = false;

  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
  }

  Widget _getTabbar() {
    if (_getDataFromServer) {
      if (_tabController == null) {
        _tabController = TabController(length: 6, vsync: this);
      }
      return Expanded(
        child: TabBar(
          controller: _tabController,
          indicatorColor: Colors.blueAccent,
          labelColor: Colors.blueAccent,
          isScrollable: true,
          tabs: <Widget>[
            Tab(
              text: 'tab 1',
              icon: Icon(Icons.directions_bike),
            ),
            Tab(
              text: 'tab 2',
              icon: Icon(Icons.directions_boat),
            ),
            Tab(
              text: 'tab 3',
              icon: Icon(Icons.directions_bus),
            ),
            Tab(
              text: 'tab 4',
              icon: Icon(Icons.directions_bus),
            ),
            Tab(
              text: 'tab 5',
              icon: Icon(Icons.directions_bus),
            ),
            Tab(
              text: 'tab 6',
              icon: Icon(Icons.directions_bus),
            ),
          ],
        ),
      );
    } else {
      return Expanded(
        child: Container(),
      );
    }
  }

  Widget _getTabview() {
    if (_getDataFromServer) {
      return TabBarView(
        controller: _tabController,
        children: <Widget>[
          Center(child: Text('自行車')),
          Center(child: Text('船')),
          Center(child: Text('巴士')),
          Center(child: Text('巴士2')),
          Center(child: Text('巴士3')),
          Center(child: Text('巴士4')),
        ],
      );
    } else {
      return Container();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Custom Tabbar'),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            Container(
              alignment: Alignment.topLeft,
              child: Row(
                children: <Widget>[
                  _getTabbar(),
                  IconButton(
                    icon: Icon(Icons.menu),
                    onPressed: () {
                      setState(() {
                        _getDataFromServer = !_getDataFromServer;
                      });
                    },
                  )
                ],
              ),
            ),
            Container(
              height: 300.0,
              child: _getTabview(),
            )
          ],
        ),
      ),
    );
  }
}

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 姓名:湯晶 公司:常州新日催化劑有限公司 【日精進打卡第113天】 【知~學習】 《六項精進》1遍 共225遍...
    晶晶_7485閱讀 217評論 0 0
  • 文/Lzzyer 勤奮對于每一個上進的人來說,是很容易的一件事,在他們的世界中,勤奮已經(jīng)變成可忽略的如同刷牙一般但...
    臭蟲子Lzzyer閱讀 974評論 0 0
  • 一 聽到不中聽的話的反應 第一種是認為自己犯了錯。這會導致我們內(nèi)疚、慚愧,甚至厭惡自己。 第二種是指責對方。在爭吵...
    吃瓜群眾heloise閱讀 167評論 0 0
  • 當時項目先集成的Facebook三方登陸的組件# react-native-facebook-login 再集成#...
    米開朗騎騾閱讀 333評論 0 1

友情鏈接更多精彩內(nèi)容