搜索插件、代码仓与 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.

所属分类

源码仓库

使用此插件的项目