Movatterモバイル変換


[0]ホーム

URL:


sliding_sheet 0.5.2copy "sliding_sheet: ^0.5.2" to clipboard
sliding_sheet: ^0.5.2 copied to clipboard

Published3 years ago

Metadata

A widget that can be dragged and scrolled in a single gesture and snapped to a list of extents.

More...

Sliding Sheet#

pub packageGitHub Stars

A widget that can be dragged and scrolled in a single gesture and snapped to a list of extents.

Example of a SlidingSheet

Clickhere to view the full example.

Installing#

Add it to yourpubspec.yaml file:

dependencies:  sliding_sheet: ^0.5.2

Install packages from the command line

flutter packages get

If you like this package, consider supporting it by giving it a star onGitHub and a like onpub.dev ❤️

Usage#

There are two ways in which you can use aSlidingSheet: either as a permanent (or persistent)Widget in yourwidget tree or as aBottomSheetDialog.

As a Widget#

This method can be used to show theSlidingSheet permanently (usually above your other widget) as shown in the example.

@overrideWidget build(BuildContext context) {  return Scaffold(    backgroundColor: Colors.grey.shade200,    appBar: AppBar(      title: Text('Simple Example'),    ),    body: SlidingSheet(      elevation: 8,      cornerRadius: 16,      snapSpec: const SnapSpec(        // Enable snapping. This is true by default.        snap: true,        // Set custom snapping points.        snappings: [0.4, 0.7, 1.0],        // Define to what the snappings relate to. In this case,         // the total available space that the sheet can expand to.        positioning: SnapPositioning.relativeToAvailableSpace,      ),      // The body widget will be displayed under the SlidingSheet      // and a parallax effect can be applied to it.      body: Center(        child: Text('This widget is below the SlidingSheet'),      ),      builder: (context, state) {        // This is the content of the sheet that will get        // scrolled, if the content is bigger than the available        // height of the sheet.        return Container(          height: 500,          child: Center(            child: Text('This is the content of the sheet'),          ),        );      },    ),  );}

Result:

Example

As a BottomSheetDialog#

This method can be used to show aSlidingSheet as aBottomSheetDialog by calling theshowSlidingBottomSheet function and returning and instance ofSlidingSheetDialog.

void showAsBottomSheet() async {  final result = await showSlidingBottomSheet(    context,    builder: (context) {      return SlidingSheetDialog(        elevation: 8,        cornerRadius: 16,        snapSpec: const SnapSpec(          snap: true,          snappings: [0.4, 0.7, 1.0],          positioning: SnapPositioning.relativeToAvailableSpace,        ),        builder: (context, state) {          return Container(            height: 400,            child: Center(              child: Material(                child: InkWell(                  onTap: () => Navigator.pop(context, 'This is the result.'),                  child: Padding(                    padding: const EdgeInsets.all(16),                    child: Text(                      'This is the content of the sheet',                      style: Theme.of(context).textTheme.body1,                    ),                  ),                ),              ),            ),          );        },      );    }  );  print(result); // This is the result.}

Result:

Example

Snapping#

ASlidingSheet can snap to multiple extents or to no at all. You can customize the snapping behavior bypassing an instance ofSnapSpec to theSlidingSheet.

ParameterDescription
snapIf true, theSlidingSheet will snap to the providedsnappings. If false, theSlidingSheet will slide from minExtent to maxExtent and then begin to scroll, if the content is bigger than the available height.
snappingsThe extents that theSlidingSheet will snap to, when the user ends a drag interaction. The minimum and maximum values will represent the bounds in which theSlidingSheet will slide until it reaches the maximum from which on it will scroll.
positioningCan be set to one of these three values:SnapPositioning.relativeToAvailableSpace - Positions the snaps relative to total available height that theSlidingSheet can expand to. All values must be between 0 and 1. E.g. a snap of0.5 in aScaffold without anAppBar would mean that the snap would be positioned at 40% of the screen height, irrespective of the height of theSlidingSheet.SnapPositioning.relativeToSheetHeight - Positions the snaps relative to the total height of the sheet. All values must be between 0 and 1. E.g. a snap of0.5 and a total sheet size of 300 pixels would mean the snap would be positioned at a 150 pixel offset from the bottom.SnapPositioning.pixelOffset - Positions the snaps at a fixed pixel offset.double.infinity can be used to refer to the total available space without having to compute it yourself.
onSnapA callback function that gets invoked when theSlidingSheet snaps to an extent.

SnapPositioning.relativeToAvailableSpace with a snap of 0.5SnapPositioning.relativeToSheetHeight with a snap of 0.5SnapPositioning.pixelOffset with a snap of 100

There are also some prebuild snaps you can facilitate to snap for example to headers or footers as shown in the example.

SnapDescription
SnapSpec.headerFooterSnapThe snap extent that makes header and footer fully visible without account for vertical padding on theSlidingSheet.
SnapSpec.headerSnapThe snap extent that makes the header fully visible without account for top padding on theSlidingSheet.
SnapSpec.footerSnapThe snap extent that makes the footer fully visible without account for bottom padding on theSlidingSheet.
SnapSpec.expandedThe snap extent that expands the wholeSlidingSheet.

SheetController#

TheSheetController can be used to change the state of aSlidingSheet manually, simply passing an instance ofSheetController to aSlidingSheet. Note that the methods can only be used after theSlidingSheet has been rendered, however calling them before wont throw an exception.

Note that you can also use the staticSheetController.of(context) method to obtain an instance of theSheetController of the closestSlidingSheet. This also works if you didn't assign aSheetController explicitly on theSlidingSheet.

MethodDescription
expand()Expands theSlidingSheet to the maximum extent.
collapse()Collapses theSlidingSheet to the minimum extent.
snapToExtent()Snaps theSlidingSheet to an arbitrary extent. The extent will be clamped to the minimum and maximum extent. If the scroll offset is > 0, theSlidingSheet will first scroll to the top and then slide to the extent.
scrollTo()Scrolls theSlidingSheet to the given offset. If theSlidingSheet is not yet at its maximum extent, it will first snap to the maximum extent and then scroll to the given offset.
rebuild()Calls all builders of theSlidingSheet to rebuild their children. This method can be used to reflect changes in theSlidingSheets children without callingsetState(() {}); on the parent widget to improve performance.
show()Visually shows theSlidingSheet if it was previously hidden. Note that calling this method wont have an effect forSlidingSheetDialogs.
hide()Visually hides theSlidingSheet until you callshow() again. Note that calling this method wont have an effect forSlidingSheetDialogs.

Headers and Footers#

Headers and footers are UI elements of aSlidingSheet that will be displayed at the top or bottom of aSlidingSheet respectively and will not get scrolled. The scrollable content will then live in between the header and the footer if specified. Delegating the touch events to theSlidingSheet is done for you. Example:

@overrideWidget build(BuildContext context) {  return Scaffold(    backgroundColor: Colors.grey.shade200,    appBar: AppBar(      title: Text('Simple Example'),    ),    body: Stack(      children: <Widget>[        SlidingSheet(          elevation: 8,          cornerRadius: 16,          snapSpec: const SnapSpec(            snap: true,            snappings: [112, 400, double.infinity],            positioning: SnapPositioning.pixelOffset,          ),          builder: (context, state) {            return Container(              height: 500,              child: Center(                child: Text(                  'This is the content of the sheet',                  style: Theme.of(context).textTheme.body1,                ),              ),            );          },          headerBuilder: (context, state) {            return Container(              height: 56,              width: double.infinity,              color: Colors.green,              alignment: Alignment.center,              child: Text(                'This is the header',                style: Theme.of(context).textTheme.body1.copyWith(color: Colors.white),              ),            );          },          footerBuilder: (context, state) {            return Container(              height: 56,              width: double.infinity,              color: Colors.yellow,              alignment: Alignment.center,              child: Text(                'This is the footer',                style: Theme.of(context).textTheme.body1.copyWith(color: Colors.black),              ),            );          },        ),      ],    ),  );}

Result:

Simple header/footer example

ListViews and Columns#

The children of aSlidingSheet are not allowed to have an inifinite (unbounded) height. Therefore when using aListView, make sure to setshrinkWrap totrue andphysics toNeverScrollableScrollPhysics. Similarly when using aColumn as a child of aSlidingSheet, make sure to set themainAxisSize toMainAxisSize.min.

Material Effects#

In order to change the UI when the sheet gets interacted with, you can pass a callback to thelistener field of aSlidingSheet that gets called with the currentSheetState whenever the sheet slides or gets scrolled. You can then rebuild your UI accordingly. When using theSlidingSheet as abottomSheetDialog you can also useSheetController.rebuild() to rebuild the sheet, if you want to change certain paramerters.

For rebuilding individual children of aSlidingSheet (e.g. elevating the header when content gets scrolled under it), you can also use theSheetListenerBuilder:

return SheetListenerBuilder(  // buildWhen can be used to only rebuild the widget when needed.  buildWhen: (oldState, newState) => oldState.isAtTop != newState.isAtTop,  builder: (context, state) {    return AnimatedContainer(      elevation: !state.isAtTop ? elevation : 0.0,      duration: const Duration(milliseconds: 400),      child: child,    );  },);

The example for instance decreases the corner radius of theSlidingSheet as it gets dragged to the top and increases the headers top padding by the status bar height. Also, when content gets scrolled under the header it elevates.

Because these are common Material behaviors,SlidingSheet supports those out of the box, which can be achieved by setting theavoidStatusBar field totrue,cornerRadiusOnFullscreen to0 andliftOnScrollHeaderElevation to the elevation.

Example of Material Effects
634
likes
90
points
1.1k
downloads

Publisher

unverified uploader

Weekly Downloads

Metadata

A widget that can be dragged and scrolled in a single gesture and snapped to a list of extents.

Homepage

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on sliding_sheet

Metadata

634
likes
90
points
1.1k
downloads

Publisher

unverified uploader

Weekly Downloads

Metadata

A widget that can be dragged and scrolled in a single gesture and snapped to a list of extents.

Homepage

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on sliding_sheet

Back


[8]ページ先頭

©2009-2025 Movatter.jp