Naik

Support reverse lists inside

@@ -139,6 +139,16 @@ class _MyHomePageState extends State<MyHomePage> { @@ -139,6 +139,16 @@ class _MyHomePageState extends State<MyHomePage> {
139 scrollController: scrollController), 139 scrollController: scrollController),
140 )), 140 )),
141 ListTile( 141 ListTile(
  142 + title: Text('Bar Modal reverse list'),
  143 + onTap: () => showBarModalBottomSheet(
  144 + expand: true,
  145 + context: context,
  146 + backgroundColor: Colors.transparent,
  147 + builder: (context, scrollController) =>
  148 + ModalInsideModal(
  149 + scrollController: scrollController, reverse: true),
  150 + )),
  151 + ListTile(
142 title: Text('Avatar Modal'), 152 title: Text('Avatar Modal'),
143 onTap: () => showAvatarModalBottomSheet( 153 onTap: () => showAvatarModalBottomSheet(
144 expand: true, 154 expand: true,
@@ -4,8 +4,10 @@ import 'package:modal_bottom_sheet/modal_bottom_sheet.dart'; @@ -4,8 +4,10 @@ import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
4 4
5 class ModalInsideModal extends StatelessWidget { 5 class ModalInsideModal extends StatelessWidget {
6 final ScrollController scrollController; 6 final ScrollController scrollController;
  7 + final bool reverse;
7 8
8 - const ModalInsideModal({Key key, this.scrollController}) : super(key: key); 9 + const ModalInsideModal({Key key, this.scrollController, this.reverse = false})
  10 + : super(key: key);
9 11
10 @override 12 @override
11 Widget build(BuildContext context) { 13 Widget build(BuildContext context) {
@@ -16,6 +18,7 @@ class ModalInsideModal extends StatelessWidget { @@ -16,6 +18,7 @@ class ModalInsideModal extends StatelessWidget {
16 child: SafeArea( 18 child: SafeArea(
17 bottom: false, 19 bottom: false,
18 child: ListView( 20 child: ListView(
  21 + reverse: reverse,
19 shrinkWrap: true, 22 shrinkWrap: true,
20 controller: scrollController, 23 controller: scrollController,
21 physics: BouncingScrollPhysics(), 24 physics: BouncingScrollPhysics(),
@@ -24,7 +27,7 @@ class ModalInsideModal extends StatelessWidget { @@ -24,7 +27,7 @@ class ModalInsideModal extends StatelessWidget {
24 tiles: List.generate( 27 tiles: List.generate(
25 100, 28 100,
26 (index) => ListTile( 29 (index) => ListTile(
27 - title: Text('Item'), 30 + title: Text('Item $index'),
28 onTap: () => showCupertinoModalBottomSheet( 31 onTap: () => showCupertinoModalBottomSheet(
29 expand: true, 32 expand: true,
30 isDismissible: false, 33 isDismissible: false,
@@ -32,7 +35,7 @@ class ModalInsideModal extends StatelessWidget { @@ -32,7 +35,7 @@ class ModalInsideModal extends StatelessWidget {
32 backgroundColor: Colors.transparent, 35 backgroundColor: Colors.transparent,
33 builder: (context, scrollController) => 36 builder: (context, scrollController) =>
34 ModalInsideModal( 37 ModalInsideModal(
35 - scrollController: scrollController), 38 + scrollController: scrollController, reverse: reverse),
36 )), 39 )),
37 )).toList(), 40 )).toList(),
38 ), 41 ),
@@ -106,7 +106,7 @@ packages: @@ -106,7 +106,7 @@ packages:
106 path: ".." 106 path: ".."
107 relative: true 107 relative: true
108 source: path 108 source: path
109 - version: "0.1.5" 109 + version: "0.1.6"
110 path: 110 path:
111 dependency: transitive 111 dependency: transitive
112 description: 112 description:
@@ -242,7 +242,11 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> @@ -242,7 +242,11 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
242 DateTime _startTime; 242 DateTime _startTime;
243 243
244 void _handleScrollUpdate(ScrollNotification notification) { 244 void _handleScrollUpdate(ScrollNotification notification) {
245 - if (notification.metrics.pixels <= notification.metrics.minScrollExtent) { 245 + double diff = _scrollController.position.axisDirection == AxisDirection.down
  246 + ? _scrollController.position.pixels
  247 + : _scrollController.position.maxScrollExtent -
  248 + _scrollController.position.pixels;
  249 + if (diff <= 0) {
246 //Check if listener is same from scrollController 250 //Check if listener is same from scrollController
247 if (!_scrollController.hasClients) return; 251 if (!_scrollController.hasClients) return;
248 252
@@ -262,7 +266,7 @@ class _ModalBottomSheetState extends State<ModalBottomSheet> @@ -262,7 +266,7 @@ class _ModalBottomSheetState extends State<ModalBottomSheet>
262 } 266 }
263 if (dragDetails != null) { 267 if (dragDetails != null) {
264 final duration = _startTime.difference(DateTime.now()); 268 final duration = _startTime.difference(DateTime.now());
265 - final offset = Offset(0, _scrollController.offset); 269 + final offset = Offset(0, diff);
266 _velocityTracker.addPosition(duration, offset); 270 _velocityTracker.addPosition(duration, offset);
267 _handleDragUpdate(dragDetails.primaryDelta); 271 _handleDragUpdate(dragDetails.primaryDelta);
268 } else if (isDragging) { 272 } else if (isDragging) {