搜索插件、代码仓与 APP 分类

smooth_sheets 封面
插件详情v1.3.1

smooth_sheets

带有流畅动画和强大灵活性的表单小部件。还支持以命令式和声明式两种方式嵌套导航。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
5.8万
喜欢数
658
Pub 分数
160

安装插件

flutter pub add smooth_sheets

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

Smooth Sheets 是一个 Flutter 包,提供高度可定制的底部弹出面板小部件,具有平滑的动画和流畅的运动效果。它支持命令式和声明式嵌套导航,非常适合复杂的 UI 流程。通过与 Android、iOS、Web、macOS、Windows 和 Linux 的无缝集成,该包为开发者提供了设计响应式底部面板的灵活性。通过精美的过渡效果和直观的交互,该包提升了用户体验,适用于模态框、侧边菜单和动态内容叠加层。

适合场景

  • 动态底部面板
  • 嵌套导航流程
  • 带动画的模态对话框
  • 侧边菜单实现
  • 交互式覆盖层
  • 响应式 UI 组件

主要特点

  • 平滑运动动画
  • 声明式和命令式导航
  • 跨平台支持
  • Flexible widget 自定义
  • 嵌套导航处理
  • 无缝过渡效果

适合对象

  • 开发交互式 UI 的开发者
  • 需要复杂底部抽屉逻辑的应用
  • 注重流畅用户体验的团队
  • 跨平台 Flutter 项目
  • 寻求动画丰富的组件的设计人员

使用建议

  • 需要了解 Flutter 的导航系统
  • 可能会略微增加包大小
  • 最适合频繁使用底部抽屉的应用程序
  • 深层嵌套结构中的潜在复杂性
  • 在复杂流程中需要仔细的状态管理

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

smooth_sheets

GitHub Repo stars Pub Version Pub Likes Pub Points

smooth_sheets offers modal and persistent sheet widgets for Flutter apps. The key features are:

  • Smooth motion: The sheets respond to user interaction with smooth, graceful motion.
  • Highly flexible: Not restricted to a specific design. Both modal and persistent styles are supported, as well as scrollable and non-scrollable widgets.
  • Supports nested navigation: A sheet is able to have multiple pages and to navigate between the pages with motion animation for transitions.
  • Works with imperative & declarative Navigator API: No special navigation mechanism is required. The traditional ways such as Navigator.push is supported and it works with Navigator 2.0 packages like go_router as well.
  • iOS flavor: The modal sheets in the style of iOS 15 are supported.

Showcases

AI Playlist Generator

An AI assistant that helps create a music playlist based on the user's preferences. See the cookbook for more details.

Key components:

  • PagedSheet
  • ModalSheetPage
  • PagedSheetPage
  • SheetDismissible

Safari app

A practical example of ios-style modal sheets. See the cookbook for more details.

Key components:

  • CupertinoStackedTransition
  • CupertinoModalSheetRoute

Airbnb mobile app clone

A partial clone of the Airbnb mobile app. The user can drag the house list down to reveal the map behind it. See the cookbook for more details.

Key components:

  • Sheet
  • SheetViewport
  • SheetPhysics
  • SheetSnapGrid
  • SheetController
  • SheetOffsetDrivenAnimation

Todo List

A simple Todo app that shows how a sheet handles the on-screen keyboard. See the cookbook for more details.

Used components:

  • Sheet
  • SheetContentScaffold
  • SheetKeyboardDismissBehavior
  • SheetDismissible
  • BottomBarVisibility

Why use this?

There are few packages on pub.dev that supports nested navigation with motion animation for page transitions. One of the great choices for this usecase is wolt_modal_sheet, which this package is inspired by. Although smooth_sheet has similar features with wolt_modal_sheet, it is not intended to be a replacement of that package. Here is some differences between those 2 packages:

wolt_modal_sheet smooth_sheets
Design Based on Wolt's design guideline Not restricted to a specific design, fully customizable
Navigation mechanism Manage the page index in ValueNotifier Works with built-in Navigator API (both of imperative and declarative)
Scrollable content Supported Supported
Persistent sheets Not supported Supported
Screen size adaptation The sheet appears as a dialog on large screens Not supported

Usage

Several resources are available for learning the functionalities of this package.


Ingredients

This section provides descriptions for each core component and links to related resources for further learning.


SheetOffset

SheetOffset represents a position of the sheet within the SheetViewport where the sheet is rendered. It's used in various situations, e.g., specifing the initial position of the sheet or defining a set of positions to which the sheet should snap.


Sheet

The basic sheet widget that can be dragged and scrollled. It can also size itself based on its content or stretched to fill available space.

See also:


PagedSheet
`PagedSheet` manages a stack of pages within a single sheet, enabling navigation between them with transitions. It works seamlessly with Flutter's Navigator API, both imperative (`Navigator.push`) and declarative (go_router, auto_route, etc...). Each page is defined using `PagedSheetPage`, which can have its own specific configuration like `initialOffset`, `snapGrid`, or `scrollConfiguration`. Transitions between pages default to the application's theme but can be customized per-page.

That navigation is built on navigator_resizable. Use that package directly if you want the same paged or dialog navigation without a sheet.

See also:


Modal Sheets

A sheet can be displayed as a modal sheet using ModalSheetRoute for imperative navigation, or ModalSheetPage for declarative navigation.

Furthermore, the modal sheets in the style of iOS 15 are also supported. For imperative navigation, use CupertinoModalSheetRoute, and for declarative navigation, use CupertinoModalSheetPage, respectively.

See also:


SheetPhysics

A physics determines how the sheet will behave when over-dragged or under-dragged, or when the user stops dragging. This is independent of the snapping behavior, which is configured via SheetSnapGrid. There are 2 predefined physics:

See also:


SheetSnapGrid

Determines how the sheet snaps to certain offsets when the user stops dragging or when an animation completes.

There are several predefined snap grid types:

See also:


SheetController

Like ScrollController for scrollable widget, the SheetController can be used to animate or observe the offset (position) of a sheet.

See also:


SheetContentScaffold

Simillar to the Scaffold, it offers the slots for a topBar (like AppBar) and a bottomBar (like BottomNavigationBar).

See also:


SheetOffsetDrivenAnimation

Formerly SheetPositionDrivenAnimation, this allows creating animations driven by the sheet's offset. It's a special kind of Animation whose value changes (typically from 0 to 1) as the sheet's offset moves between specified startOffset and endOffset values (defined using SheetOffset). This is useful for synchronizing UI changes (like fades, slides, or color changes) with the sheet's movement.

See also:


SheetNotification

A sheet dispatches a SheetNotification when its offset changes. This can be used to observe the offset and other metrics (like min/max offset, viewport size) of a descendant sheet from an ancestor widget using a NotificationListener.

NotificationListener<SheetNotification>(
  onNotification: (notification) {
    // Access sheet metrics via notification.metrics (e.g., offset, minOffset, maxOffset)
    debugPrint('Current offset: ${notification.metrics.offset}');
    return false; // Return true to stop the notification from bubbling up
  },
  child: SheetViewport( // Required for non-modal sheets
    child: Sheet(
      // ... sheet configuration
    ),
  ),
),

See also:


SheetKeyboardDismissBehavior

SheetKeyboardDismissBehavior determines when the sheet should dismiss the on-screen keyboard when dragged. This feature is similar to ScrollViewKeyboardDismissBehavior for scrollable widgets. This behavior is configured via the Sheet.keyboardDismissBehavior property.

Although it is easy to create custom behaviors by implementing the SheetKeyboardDismissBehavior interface, there are predefined behaviors available as static constants for convenience:

See also:


Others

所属分类

依赖

依赖清单 4 项

源码仓库

使用此插件的项目