Skip to content

Commit

Permalink
Update AnimatedSliverExpandable to use without header and control exp…
Browse files Browse the repository at this point in the history
…anded state (#1)

* Added WithStateAnimatedSliverExpandable

* Change AnimatedSliverExpandable instead of introducing new widget

---------

Co-authored-by: Amir Panahandeh <[email protected]>
  • Loading branch information
iabdousd and Amir-P authored Oct 22, 2023
1 parent 2424be8 commit 251ff70
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 53 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
## 1.0.0

* Ability to use without a header
* **Breaking Changes**:
* `AnimatedSliverExpandable` no longer performs toggling the state and instead a boolean value for `expanded` should be provided
* `SliverExpandableHeaderBuilder` signature changed to drop the `onToggle` callback

## 0.0.1

* Initial release
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@ Sliver Expandable lets expand and collapse any Sliver in Flutter.
1. Add it to your `pubspec.yaml`:

```yaml
sliver_expandable: ^0.0.1
sliver_expandable: ^1.0.0
```
2. Use it:
```dart
AnimatedSliverExpandable(
headerBuilder: (context, animation, onToggle) => ListTile(
onTap: onToggle,
expanded: _expanded,
headerBuilder: (context, animation) => ListTile(
onTap: () => setState(() => _expanded = !_expanded),
tileColor: Colors.amber,
title: const Text('Expandable'),
trailing: AnimatedBuilder(
Expand Down
14 changes: 11 additions & 3 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,16 @@ class MyApp extends StatelessWidget {
}
}

class MyHomePage extends StatelessWidget {
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});

@override
State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
bool _expanded = false;

@override
Widget build(BuildContext context) {
return Scaffold(
Expand All @@ -46,8 +53,9 @@ class MyHomePage extends StatelessWidget {
childCount: 5,
)),
AnimatedSliverExpandable(
headerBuilder: (context, animation, onToggle) => ListTile(
onTap: onToggle,
expanded: _expanded,
headerBuilder: (context, animation) => ListTile(
onTap: () => setState(() => _expanded = !_expanded),
tileColor: Colors.amber,
title: const Text('Expandable'),
trailing: AnimatedBuilder(
Expand Down
56 changes: 28 additions & 28 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ packages:
dependency: transitive
description:
name: async
sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.10.0"
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
Expand All @@ -21,10 +21,10 @@ packages:
dependency: transitive
description:
name: characters
sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
version: "1.3.0"
clock:
dependency: transitive
description:
Expand All @@ -37,10 +37,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
url: "https://pub.dev"
source: hosted
version: "1.17.0"
version: "1.17.2"
cupertino_icons:
dependency: "direct main"
description:
Expand Down Expand Up @@ -75,14 +75,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
js:
dependency: transitive
description:
name: js
sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7"
url: "https://pub.dev"
source: hosted
version: "0.6.5"
lints:
dependency: transitive
description:
Expand All @@ -95,34 +87,34 @@ packages:
dependency: transitive
description:
name: matcher
sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72"
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev"
source: hosted
version: "0.12.13"
version: "0.12.16"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev"
source: hosted
version: "0.2.0"
version: "0.5.0"
meta:
dependency: transitive
description:
name: meta
sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42"
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
url: "https://pub.dev"
source: hosted
version: "1.8.0"
version: "1.9.1"
path:
dependency: transitive
description:
name: path
sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b
sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
url: "https://pub.dev"
source: hosted
version: "1.8.2"
version: "1.8.3"
sky_engine:
dependency: transitive
description: flutter
Expand All @@ -134,15 +126,15 @@ packages:
path: ".."
relative: true
source: path
version: "0.0.1"
version: "1.0.0"
source_span:
dependency: transitive
description:
name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
version: "1.10.0"
stack_trace:
dependency: transitive
description:
Expand Down Expand Up @@ -179,10 +171,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
url: "https://pub.dev"
source: hosted
version: "0.4.16"
version: "0.6.0"
vector_math:
dependency: transitive
description:
Expand All @@ -191,6 +183,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.4"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
sdks:
dart: ">=2.19.6 <3.0.0"
dart: ">=3.1.0-185.0.dev <4.0.0"
flutter: ">=1.17.0"
42 changes: 25 additions & 17 deletions lib/src/widgets/sliver_expandable.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,21 @@ import 'package:flutter/rendering.dart';
import 'package:sliver_expandable/src/rendering/render_sliver_expandable.dart';

typedef SliverExpandableHeaderBuilder = Widget Function(
BuildContext context, Animation<double> animation, VoidCallback onToggle);
BuildContext context, Animation<double> animation);

class AnimatedSliverExpandable extends StatefulWidget {
final Widget sliver;
final SliverExpandableHeaderBuilder headerBuilder;
final Duration duration;
final Curve curve;
final double translationOffset;
final bool expanded;
final SliverExpandableHeaderBuilder? headerBuilder;

const AnimatedSliverExpandable({
super.key,
required this.headerBuilder,
required this.sliver,
this.headerBuilder,
this.expanded = false,
this.duration = const Duration(milliseconds: 250),
this.curve = Curves.easeInOut,
this.translationOffset = 200,
Expand All @@ -28,37 +30,43 @@ class AnimatedSliverExpandable extends StatefulWidget {

class _AnimatedSliverExpandableState extends State<AnimatedSliverExpandable>
with SingleTickerProviderStateMixin {
late final controller = AnimationController(vsync: this);

void _onToggle() {
if (controller.status == AnimationStatus.completed ||
controller.status == AnimationStatus.forward) {
controller.animateBack(0, duration: widget.duration);
} else {
controller.animateTo(1, duration: widget.duration);
late final controller = AnimationController(
vsync: this,
value: widget.expanded ? 1 : 0,
);

@override
void didUpdateWidget(covariant AnimatedSliverExpandable oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.expanded != widget.expanded) {
if (widget.expanded) {
controller.animateBack(1, duration: widget.duration);
} else {
controller.animateTo(0, duration: widget.duration);
}
}
}

@override
Widget build(BuildContext context) {
final curvedAnimation =
CurvedAnimation(curve: widget.curve, parent: controller);
final animation = CurvedAnimation(curve: widget.curve, parent: controller);
return SliverExpandable(
animation: curvedAnimation,
header: widget.headerBuilder(context, curvedAnimation, _onToggle),
animation: animation,
header: widget.headerBuilder?.call(context, animation),
sliver: widget.sliver,
);
}
}

class SliverExpandable extends RenderObjectWidget {
final Animation<double> animation;
final Widget header, sliver;
final Widget? header;
final Widget sliver;
final double translationOffset;

const SliverExpandable({
super.key,
required this.header,
this.header,
required this.sliver,
required this.animation,
this.translationOffset = 200,
Expand Down
4 changes: 2 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
name: sliver_expandable
description: A Sliver Flutter widget that can be used to expand or collapse another child Sliver widget
version: 0.0.1
version: 1.0.0
homepage: https://github.com/Taskulu/sliver_expandable
repository: https://github.com/Taskulu/sliver_expandable
issue_tracker: https://github.com/Taskulu/sliver_expandable/issues
screenshots:
- description: 'This screenshots shows an expanding and collapsing SliverList in a CustomScrollView'
- description: 'This screenshot shows an expanding and collapsing SliverList in a CustomScrollView'
path: screenshots/1.webp
topics:
- sliver
Expand Down

0 comments on commit 251ff70

Please sign in to comment.