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

sliver_sticky_collapsable_panel 封面
套件詳情v5.0.1

sliver_sticky_collapsable_panel

一個黏附式可摺疊面板的 Sliver 實現,包含狀態變更時重新建構的方塊標題以及作為面板內容的 Sliver 子項。

AndroidiOSWebmacOSWindowsLinux
近 30 天下載
2480
喜歡數
121
Pub 分數
160

安裝套件

flutter pub add sliver_sticky_collapsable_panel

套件介紹

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

一個基於 Sliver 的小部件,實現了可黏附且可摺疊的面板,其標題會根據滾動狀態動態重建。它具有可自定義的盒子標題,可在面板展開或摺疊時更新,並接受一個 Sliver 子項作為面板內容。專為複雜列表中的高效滾動設計,可無縫整合到多個平台的 CustomScrollView 布局中。

適用情境

  • 帶互動式標題的滾動列表
  • 滾動時的動態標題狀態
  • 需要固定面板的複雜UI
  • 可展開/收合的內容區塊
  • 可自訂的滾動驅動互動

主要特色

  • 黏性面板行為
  • 滾動時重新建構標題
  • Sliver 兼容佈局
  • 可摺疊內容區塊
  • 平台無關的實作

適合對象

  • 開發可滾動介面的開發者
  • 需要響應式標題的應用
  • CustomScrollView 集成
  • 跨平台行動與Web應用
  • 具有層疊式可捲動內容的 UI

使用建議

  • 需要在 CustomScrollView 內進行整合
  • 僅限基於銀色的佈局
  • 標題邏輯可能需要自定義調校
  • 性能取決於子項的複雜性
  • 不適用於非滾動上下文

原始 README

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

sliver_sticky_collapsable_panel

pub license build status flutter compatibility dart compatibility

A Sliver implementation of sticky collapsable panel, with a box header rebuild on status and a sliver child as panel content.

Snap Shot

simple Shot

Features

  • Relying solely on the Flutter framework itself, no any other dependencies.
  • Pure Dart implementation, running on any platform who supports Flutter.
  • Command style support for expand/collpase the panel.(it's still compatible with declarative style)
  • Accept one box child as header and one sliver child as panel content.
  • Header can overlap panel content (useful for sticky side header for example).
  • Notify and rebuild the header when status changed (scroll outside the viewport for example).
  • Support not sticky headers (with sticky: false parameter).
  • Support a controller which notifies the scroll offset of the current sticky header.
  • Support click the header to collapse the panel, or disable collapse (with disableCollapsable = true parameter in panelController).
  • Support iOS style sticky header, just like iOS's system contact app (with iOSStyleSticky = true parameter).
  • Support add padding for sliver child (with paddingBeforeCollapse parameter).
  • Support add padding after the header even the panel collapsed (with paddingAfterCollapse parameter).

Getting started

  • In the pubspec.yaml of your flutter project, add the following dependency:

    dependencies:
      sliver_sticky_collapsable_panel: ^5.0.1
    
  • In your library add the following import:

    import 'package:sliver_sticky_collapsable_panel/sliver_sticky_collapsable_panel.dart';
    
  • In your code, use the sliver like this:

    CustomScrollView(
      controller: _scrollController,
      slivers: [
        SliverStickyCollapsablePanel(
          scrollController: _scrollController,
          panelController: StickyCollapsablePanelController(key:'key_1'),
          headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
          sliverPanel: SliverList.list(children: [...]),
        ),
        SliverStickyCollapsablePanel(
          scrollController: _scrollController,
          panelController: StickyCollapsablePanelController(key:'key_2'),
          headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
          sliverPanel: SliverList.list(children: [...]),
        ),
        ...,
      ],
    );
    
  • For simple right side header arrow hint ^, you can build with widget in flutter framework like AnimatedRotation:

    SliverStickyCollapsablePanel(
      scrollController: _scrollController,
      panelController: StickyCollapsablePanelController(key:'key_1'),
      headerBuilder: (context, status) => Container(
        width: double.infinity,
        height: 48,
        child: Stack(
          children: [
            Text("your title, or any other box widget you like"),
            Align(
              alignment: Alignment.centerRight,
              child: AnimatedRotation(
                duration: const Duration(milliseconds: 0),
                turns: status.isExpanded ? 0 : 0.5,
                child: const Icon(Icons.expand_more),
              ),
            ), 
          ],
        ),
      ),
      sliverPanel: SliverList.list(children: [...]),
    ),
    

More Advanced Feature:

  • You can disable collapse for any sliver you wanted, just add disableCollapsable = true.
    CustomScrollView(
      controller: _scrollController,
      slivers: [
        SliverStickyCollapsablePanel(
          scrollController: _scrollController,
          panelController: StickyCollapsablePanelController(key:'key_1',disableCollapsable: true),
          headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
          sliverPanel: SliverList.list(children: [...]),
        ),
        ...,
      ],
    );
    

  • You can enable iOS style sticky header, just like the system's contact app with just one parameter iOSStyleSticky = true.
    CustomScrollView(
      controller: _scrollController,
      slivers: [
        SliverStickyCollapsablePanel(
          scrollController: _scrollController,
          panelController: StickyCollapsablePanelController(key:'key_1'),
          iOSStyleSticky: true,
          headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
          sliverPanel: SliverList.list(children: [...]),
        ),
        ...,
      ],
    );
    
    simple Shot

  • You can add padding for sliver child (with paddingBeforeCollapse), even if the panel is collapsed, the padding still work between headers with paddingAfterCollapse.
    CustomScrollView(
      controller: _scrollController,
      slivers: [
        SliverStickyCollapsablePanel(
          scrollController: _scrollController,
          panelController: StickyCollapsablePanelController(key:'key_1'),
          paddingBeforeCollapse: const EdgeInsets.all(16),
          paddingAfterCollapse: const EdgeInsets.only(bottom: 10),
          headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
          sliverPanel: SliverList.list(children: [...]),
        ),
        ...,
      ],
    );
    
    simple Shot

  • You can animate collapse/expand with only one parameter: panelAnimationDuration
    CustomScrollView(
      controller: _scrollController,
      slivers: [
        SliverStickyCollapsablePanel(
          scrollController: _scrollController,
          panelController: StickyCollapsablePanelController(key:'key_1'),
          panelAnimationDuration: Duration(milliseconds: 300),
          paddingBeforeCollapse: const EdgeInsets.all(16),
          paddingAfterCollapse: const EdgeInsets.only(bottom: 10),
          headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
          sliverPanel: SliverList.list(children: [...]),
        ),
        ...,
      ],
    );
    

Performance configuration

  • You can use optional parameter headerSize to speed up the layout process when the size not change
    • if your header size maybe change, just keep this parameter null (which is the default)
      CustomScrollView(
        controller: _scrollController,
        slivers: [
          SliverStickyCollapsablePanel(
            scrollController: _scrollController,
            panelController: StickyCollapsablePanelController(key:'key_1'),
            iOSStyleSticky: true,
            headerBuilder: (context, status) => SizedBox.fromSize(size: Size.fromHeight(48)),
            headerSize: Size(MediaQuery.of(context).size.width, 48),
            sliverPanel: SliverList.list(children: [...]),
          ),
          ...,
        ],
      );
      

Thanks

所屬分類

原始碼儲存庫

使用此套件的專案

暫無相關資料。