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

expandable 封面
套件詳情v5.0.1

expandable

一個可點擊標題或圖示來展開或收起的 Flutter 小部件。

AndroidiOSWebmacOSWindowsLinux
近 30 天下載
30.8萬
喜歡數
1830
Pub 分數
140

安裝套件

flutter pub add expandable

套件介紹

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

可擴展套件提供了一個 Flutter 小部件,允許內容在展開和收起狀態之間切換,通常由標題或圖示觸發。它透過讓使用者按需求顯示或隱藏詳細資訊,增強了使用者介面的互動性,提升空間效率與導航體驗。適用於清單、常見問題或設定區段,支援平滑動畫與自訂標題。此套件可在所有主要平台(包括 Android、iOS、Web、macOS、Windows 與 Linux)上相容使用。

適用情境

  • 常見問題部分
  • 可摺疊清單
  • 設定面板
  • 動態內容隱藏
  • 使用者個人檔案細節
  • 互動式表單

主要特色

  • 平滑的展開/收合動畫
  • 可自訂的標題和圖示
  • 支援多個展開狀態
  • 與現有組件的輕鬆整合
  • 跨平台相容性
  • 可設定的持續時間與曲線

適合對象

  • 開發互動式 UI 的開發者
  • 內容密集的佈局應用程式
  • 需要可摺疊區塊的行動與Web應用程式
  • 尋求可重用組件的UI設計師
  • 需要響應式內容管理的專案

使用建議

  • 在大型資料集上可能影響效能
  • 需要謹慎的狀態管理
  • 動畫時間可能需要調整以優化使用者體驗
  • 僅限單層展開,無需額外邏輯
  • 不適用於需要自訂的複雜巢狀結構

原始 README

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

Expandable

A Flutter widget that can be expanded or collapsed by the user.

Introduction

This library helps implement expandable behavior as prescribed by Material Design:

animated image

Expandable should not be confused with ExpansionPanel. ExpansionPanel, which is a part of Flutter material library, is designed to work only within ExpansionPanelList and cannot be used for making other widgets, for example, expandable Card widgets.

Usage

The easiest way to make an expandable widget is to use ExpandablePanel:

class ArticleWidget extends StatelessWidget {
  
  final Article article;
  
  ArticleWidget(this.article);

  @override
  Widget build(BuildContext context) {
    return ExpandablePanel(
      header: Text(article.title),
      collapsed: Text(article.body, softWrap: true, maxLines: 2, overflow: TextOverflow.ellipsis,),
      expanded: Text(article.body, softWrap: true, ),
      tapHeaderToExpand: true,
      hasIcon: true,
    );
  }
}

ExpandablePanel has a number of properties to customize its behavior, but it's restricted by having a title at the top and an expand icon shown as a down arrow (on the right or on the left). If that's not enough, you can implement custom expandable widgets by using a combination of Expandable, ExpandableNotifier, and ExpandableButton:

class EventPhotos extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return ExpandableNotifier(  // <-- Provides ExpandableController to its children
      child: Column(
        children: [
          Expandable(           // <-- Driven by ExpandableController from ExpandableNotifier
            collapsed: ExpandableButton(  // <-- Expands when tapped on the cover photo
              child: buildCoverPhoto(),
            ),
            expanded: Column(  
              children: [
                buildAllPhotos(),
                ExpandableButton(       // <-- Collapses when tapped on
                  child: Text("Back"),
                ),
              ]
            ),
          ),
        ],
      ),
    );
  }
}

Automatic Scrolling

Expandable widgets are often used within a scroll view. When the user expands a widget, be it an ExpandablePanel or an Expandable with a custom control, they expect the expanded widget to fit within the viewable area (if possible). For example, if you show a list of articles with a summary of each article, and the user expands an article to read it, they expect the expanded article to occupy as much screen space as possible. The Expandable package contains a widget to help implement this behavior, ScrollOnExpand. Here's how to use it:

   ExpandableNotifier(      // <-- This is where your controller lives
     //...
     ScrollOnExpand(        // <-- Wraps the widget to scroll
      //...
        ExpandablePanel(    // <-- Your Expandable or ExpandablePanel
          //...
        )
     )
  )

Why a separate widget, you might ask? Because generally you might want to show not just the expanded widget but its container, for example a Card that contains it. See the example app for more details on the usage of ScrollOnExpand.

Themes

Version 4.0 introduced themes to expandable widgets. Themes greatly simplify visual customization and as well as future extensibility. Each expandable widget can get its theme data directly via the constructor or from the nearest ExpandableTheme widget:

  ExpandableTheme(
    data: ExpandableThemeData(
        iconColor: Colors.red, 
        animationDuration: const Duration(milliseconds: 500)
    ),
      // ...
      Expandable(  // 500 milliseconds animation duration
      ),

      // ...
      ExpandablePanel(  // <-- Blue icon color, 500 milliseconds animation duration
        theme: ExpandableThemeData(iconColor: Colors.blue),
  
      ),
  )

ExpandableTheme widgets can be nested, in which case inner definitions override outer definitions. There is a default theme with fallback values defined in ExpandableThemeData.defaults.

Prior to version 4.0, theme parameters were passed to widget constructors directly. These parameters are now deprecated and will be removed in the next release.

Icon Customization

There are several theme properties that help customize the expand/collapse icon:

  • hasIcon - should the icon be shown in the header of [ExpandablePanel];
  • iconSize - icon size;
  • iconColor - icon color;
  • iconPadding - icon padding;
  • iconPlacement - icon placement in the header;
  • iconRotationAngle - the angle to which to rotate the icon;
  • expandIcon - icon face to use in the collapsed state;
  • collapseIcon - icon face to use in the expanded state.

When specifying a custom icon, you have the option to use the same icon for expand/collapse or to use two different icons. If using the same icon, specify the same value for expandIcon and collapseIcon, and that icon will be shown as-is in the collapsed state and upside-down in the expanded state.

Migration

If you have migration issues from a previous version, read the Migration Guide.

所屬分類

原始碼儲存庫

使用此套件的專案