搜尋套件、儲存庫與 APP 分類

contained_tab_bar_view 封面
套件詳情v0.8.0

contained_tab_bar_view

將 TabController、TabBar 和 TabBarView 封裝成一個可自訂的 Widget。

AndroidiOSWebmacOSWindowsLinux
近 30 天下載
5950
喜歡數
189
Pub 分數
160

安裝套件

flutter pub add contained_tab_bar_view

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

ContainedTabBarView 是一個可自訂的 Flutter 小工具,將 TabController、TabBar 和 TabBarView 結合成單一整合元件。它透過自動處理狀態管理與版面配置,簡化標籤介面的實作,讓開發者能專注於設計與內容。此套件支援所有主要平台,包括 Android、iOS、Web、macOS、Windows 與 Linux,非常適合跨平台應用。以乾淨直覺的 API,提升程式碼可讀性並減少重複程式碼。特別適用於建立多個標籤的導航密集型介面。

適用情境

  • 在移動和網頁應用中建立標籤導航
  • 簡化複雜的標籤介面實作
  • 在專案間建構可重用的標籤元件
  • 實現動態標籤佈局
  • 設計響應式標籤頁儀表板

主要特色

  • TabController、TabBar 和 TabBarView 的單一組件封裝
  • 標籤頁的內建狀態管理
  • 可自定義的外觀和行為
  • 跨平台支援
  • 所需的最小樣板
  • 支援動態新增/移除標籤頁

適合對象

  • 尋求簡化標籤介面的開發者
  • 需要一致制表符導航的項目
  • 跨平台 Flutter 應用
  • 需要可重複使用標籤邏輯的UI元件
  • 注重可維護代碼的團隊

使用建議

  • 可能需要額外的樣式設定以實現進階自訂
  • 僅限標準標籤頁模式,不支援深度自訂
  • 依賴於 Flutter 的內建標籤元件
  • 不太適合高度非標準的標籤頁行為
  • 最適合典型的基於標籤的導航流程

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

ContainedTabBarView

pub package

ContainedTabBarView encapsulates TabController, TabBar and TabBarView into a single, easy to use Widget and lets you customize its appearance without worrying about internal workings of "TabBar ecosystem".


Usage

All of the below examples can be found under example, each written as a simple StatelessWidget.

Basic

Basic usage includes putting a ContainedTabBarView into a Container whose constraints it will obey. Putting a ContainedTabBarView directly into a body of a Scaffold will, expectedly, draw it full-screen.

// Example 1
import 'package:contained_tab_bar_view/contained_tab_bar_view.dart';

...

Container(
  padding: const EdgeInsets.all(8.0),
  color: Colors.blue,
  width: 200,
  height: 300,
  child: ContainedTabBarView(
    tabs: [
      Text('First'),
      Text('Second'),
    ],
    views: [
      Container(color: Colors.red),
      Container(color: Colors.green)
    ],
    onChange: (index) => print(index),
  ),
),

example 1 example 2 example 3

Intermediate

TabBarProperties

All the properties that can be set for a TabBar are accessible for setting via tabBarProperties. Also, there are many more for the customization of TabBar's appearance. To create your own ("container-based") indicator, you can use ContainerTabIndicator decoration (see examples 4 and 6) which is a part of this package, but also a separate package whose documentation can be found here. Of course, you can use any other tab bar indicator of your liking.

Property Type Default value Description
width double / The width of TabBar. If not set, it's full available width.
height double kToolbarHeight The height of TabBar. The TabBarView takes the available height minus this value.
background Container / Container that is behind the tabs. See example 8.
position TabBarPosition TabBarPosition.top Position of TabBar in respect to it's TabBarView. See example 5.
alignment TabBarAlignment TabBarAlignment.center Alignment of TabBar (if it's width is not full available) within TabBar-TabBarView flex. See example 5.
padding EdgeInsets const EdgeInsets.all(0.0) The TabBars padding. See example 4.
margin EdgeInsets const EdgeInsets.all(0.0) The TabBars margin. See example 8.
indicator Decoration / The decoration for the active tab. You can use ContainerTabIndicator for various customization. See example 4. Also, see TabBar documentation
indicatorColor Color / see TabBar documentation
indicatorPadding EdgeInsetsGeometry const EdgeInsets.all(0.0) see TabBar documentation
indicatorSize TabBarIndicatorSize / see TabBar documentation
indicatorWeight double 2.0 see TabBar documentation
isScrollable bool false see TabBar documentation
labelColor Color / see TabBar documentation
labelPadding EdgeInsetsGeometry const EdgeInsets.all(0.0) see TabBar documentation
labelStyle TextStyle / see TabBar documentation
unselectedLabelColor Color / see TabBar documentation
unselectedLabelStyle TextStyle / see TabBar documentation
TabBarViewProperties

All the properties that can be set for a TabBarView are accessible for setting via tabBarViewProperties.

Property Type Default value Description
dragStartBehavior DragStartBehavior DragStartBehavior.start See TabBarView documentation
physics ScrollPhysics (platform specific) See TabBarView documentation

For example, if you want to disable swiping behavior on the TabBarView, set the option like this:

ContainedTabBarView(
  ...
  tabBarViewProperties: TabBarViewProperties(
    physics: NeverScrollableScrollPhysics(),
  ),
)
TabBarPosition
enum TabBarPosition { top, bottom, left, right }
TabBarAlignment
enum TabBarAlignment { start, center, end }
Intermediate Examples
// Example 5
ContainedTabBarView(
  tabs: [
      Text('First'),
      Text('Second'),
  ],
  tabBarProperties: TabBarProperties(
    width: 200,
    height: 32,
    background: Container(
      decoration: BoxDecoration(
        color: Colors.blue,
        borderRadius: BorderRadius.all(Radius.circular(8.0)),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.4),
            spreadRadius: 0.5,
            blurRadius: 2,
            offset: Offset(1, -1),
          ),
        ],
      ),
    ),
    position: TabBarPosition.bottom,
    alignment: TabBarAlignment.end,
    indicatorColor: Colors.transparent,
    labelColor: Colors.white,
    unselectedLabelColor: Colors.grey[400],
  ),
  views: [
    Container(color: Colors.red),
    Container(color: Colors.green),
  ],
)

example 4 example 5 example 6

Advanced

Change tab from another Widget

To control the state, i.e. move to another tab, from outside of ContainedTabBarView create it with a GlobalKey and then use methods exposed from state: animateTo(), next() and previous().

// Example 7
class Example7 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    GlobalKey<ContainedTabBarViewState> _key = GlobalKey();
    ContainedTabBarView containedTabBarView = ContainedTabBarView(
      key: _key,
      tabs: [
        Text('First'),
        Text('Second'),
      ],
      views: [
        Container(color: Colors.red),
        Container(color: Colors.green),
      ],
    );

    return Scaffold(
      appBar: AppBar(
        title: Text('Example 7'),
      ),
      body: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () => _key.currentState?.previous(),
            child: Icon(Icons.arrow_back_ios),
          ),
          Center(
            child: Container(
              padding: const EdgeInsets.all(8.0),
              color: Colors.blue,
              width: 200,
              height: 300,
              child: containedTabBarView,
            ),
          ),
          ElevatedButton(    
            onPressed: () => _key.currentState?.next(),
            child: Icon(Icons.arrow_forward_ios),
          ),
        ],
      ),
    );
  }
}
Advanced Examples

example 7 example 8 example 9

Contributing

This package is still in early stages. If you notice any bugs, please file an issue. If you are willing to fix or enhance things yourself, you are very welcome to make a pull request.

所屬分類

依賴

依賴清單 1 項

原始碼儲存庫

使用此套件的專案