backdrop 0.6.1 backdrop: ^0.6.1 copied to clipboard
Backdrop implementation in dart. (https://material.io/design/components/backdrop.html)
backdrop #
Backdrop implementation in flutter.
This widget is in active development. Any contribution, idea, criticism or feedback is welcomed.
NOTE: If using Flutter v1.x.x, use v0.5.x pub version.
Quick links #
package | https://pub.dev/packages/backdrop |
Live Demo | https://fluttercommunity.github.io/backdrop/demo/#/ |
Git Repo | https://github.com/fluttercommunity/backdrop |
Issue Tracker | https://github.com/fluttercommunity/backdrop/issues |
Chat Room | https://gitter.im/flutter-backdrop |
Getting started #
Follow the medium article to Quickly Implement Backdrop in Flutter.
Usage #
BackdropScaffold #
Use BackdropScaffold
instead of the standard Scaffold
in your app.
A backLayer
and a frontLayer
have to be defined for the backdrop to work.
BackdropScaffold(
appBar: BackdropAppBar(
title: Text("Backdrop Example"),
actions: <Widget>[
BackdropToggleButton(
icon: AnimatedIcons.list_view,
)
],
),
backLayer: Center(
child: Text("Back Layer"),
),
frontLayer: Center(
child: Text("Front Layer"),
),
)
Navigation with backdrop #
To use backdrop for navigation, use the provided BackdropNavigationBackLayer
as backLayer
.
The BackdropNavigationBackLayer
contains a property items
representing the list elements shown on the back layer. The front layer has to be "manually" set depending on the current index, which can be accessed with the onTap
callback.
int _currentIndex = 0;
final List<Widget> _pages = [Widget1(), Widget2()];
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Backdrop Demo',
home: BackdropScaffold(
appBar: BackdropAppBar(
title: Text("Navigation Example"),
actions: <Widget>[
BackdropToggleButton(
icon: AnimatedIcons.list_view,
)
],
),
stickyFrontLayer: true,
frontLayer: _pages[_currentIndex],
backLayer: BackdropNavigationBackLayer(
items: [
ListTile(title: Text("Widget 1")),
ListTile(title: Text("Widget 2")),
],
onTap: (int position) => {setState(() => _currentIndex = position)},
),
),
);
}
Accessing underlying backdrop functionalities #
To access backdrop related functionalities, use Backdrop.of(context)
to get underlying BackdropScaffoldState
.
BackdropScaffoldState
exposes various properties and methods like:
- properties
controller -> AnimationController
scaffoldKey -> GlobalKey<ScaffoldState>
isBackLayerConcealed -> bool
isBackLayerRevealed -> bool
- methods
fling()
concealBackLayer()
revealBackLayer()
Note: Backdrop
is an InheritedWidget
and therefore like Scaffold.of
, Theme.of
and MediaQuery.of
, the BuildContext context
passed to Backdrop.of(context)
should be of a Widget
that is under the BackdropScaffold
in the "widget tree". In other words, Backdrop.of
called inside a widget where the BackdropScaffold
is initalized will not work explicitly, since the context
passed is of the widget that will build BackdropScaffold
therefore above BackdropScaffold
. This can be solved by either making a seperate Widget
where Backdrop.of
needs to be used and make it the "child" of BackdropScaffold
or wrap the Backdrop.of
usage around Builder
widget so that the "correct" context
(from Builder
) is passed to Backdrop.of
. This answere on SO and FWotW video on Builder gives a very good idea of how and why Builder
works in later case.
For more information, check out sample code in the example directory, demo app with use-cases and code for it and API references generated by pub.dev.
Contribute #
Check proposal documents for v1.0 and web&desktop milestones before you begin with any contibution.
- You'll need a GitHub account.
- Fork the repository.
- Pick an issue to work on from issue tracker.
- Implement it.
- Add your name and email in
authors
section inpubspec.yaml
file. - Send merge request.
- Star this project.
- Become a hero!!
Features and bugs #
Please file feature requests and bugs at the issue tracker.
Contributors β¨ #
Thanks goes to these wonderful people (emoji key):
This project follows the all-contributors specification. Contributions of any kind welcome!