diff --git a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart index 2ce9adb5..c77b668c 100644 --- a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart +++ b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/positioned_list.dart @@ -45,6 +45,7 @@ class PositionedList extends StatefulWidget { this.addSemanticIndexes = true, this.addRepaintBoundaries = true, this.addAutomaticKeepAlives = true, + this.keyboardDismissBehavior, }) : assert((positionedIndex == 0) || (positionedIndex < itemCount), 'positionedIndex cannot be 0 and must be smaller than itemCount'), super(key: key); @@ -134,6 +135,10 @@ class PositionedList extends StatefulWidget { /// See [SliverChildBuilderDelegate.addAutomaticKeepAlives]. final bool addAutomaticKeepAlives; + /// [ScrollViewKeyboardDismissBehavior] the defines how this [PositionedList] will + /// dismiss the keyboard automatically. + final ScrollViewKeyboardDismissBehavior? keyboardDismissBehavior; + @override State createState() => _PositionedListState(); } @@ -173,6 +178,7 @@ class _PositionedListState extends State { anchor: widget.alignment, center: _centerKey, controller: scrollController, + keyboardDismissBehavior: widget.keyboardDismissBehavior, scrollDirection: widget.scrollDirection, reverse: widget.reverse, cacheExtent: widget.cacheExtent, diff --git a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scroll_view.dart b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scroll_view.dart index a0b499c0..1aff0df3 100644 --- a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scroll_view.dart +++ b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scroll_view.dart @@ -28,9 +28,12 @@ class UnboundedCustomScrollView extends CustomScrollView { List slivers = const [], int? semanticChildCount, DragStartBehavior dragStartBehavior = DragStartBehavior.start, + ScrollViewKeyboardDismissBehavior? keyboardDismissBehavior, }) : _anchor = anchor, super( key: key, + keyboardDismissBehavior: keyboardDismissBehavior ?? + ScrollViewKeyboardDismissBehavior.manual, scrollDirection: scrollDirection, reverse: reverse, controller: controller, diff --git a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart index 765a90a0..f3203ff6 100644 --- a/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart +++ b/packages/stream_chat_flutter/lib/scrollable_positioned_list/src/scrollable_positioned_list.dart @@ -52,6 +52,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addRepaintBoundaries = true, this.minCacheExtent, this.findChildIndexCallback, + this.keyboardDismissBehavior, }) : itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, separatorBuilder = null, super(key: key); @@ -77,6 +78,7 @@ class ScrollablePositionedList extends StatefulWidget { this.addRepaintBoundaries = true, this.minCacheExtent, this.findChildIndexCallback, + this.keyboardDismissBehavior, }) : assert(separatorBuilder != null, 'seperatorBuilder cannot be null'), itemPositionsNotifier = itemPositionsListener as ItemPositionsNotifier?, super(key: key); @@ -92,6 +94,10 @@ class ScrollablePositionedList extends StatefulWidget { /// index of the child element with that associated key, or null if not found. final ChildIndexGetter? findChildIndexCallback; + /// [ScrollViewKeyboardDismissBehavior] the defines how this [PositionedList] will + /// dismiss the keyboard automatically. + final ScrollViewKeyboardDismissBehavior? keyboardDismissBehavior; + /// Number of items the [itemBuilder] can produce. final int itemCount; @@ -344,6 +350,7 @@ class _ScrollablePositionedListState extends State child: NotificationListener( onNotification: (_) => _isTransitioning, child: PositionedList( + keyboardDismissBehavior: widget.keyboardDismissBehavior, itemBuilder: widget.itemBuilder, separatorBuilder: widget.separatorBuilder, itemCount: widget.itemCount, @@ -374,6 +381,8 @@ class _ScrollablePositionedListState extends State child: NotificationListener( onNotification: (_) => false, child: PositionedList( + keyboardDismissBehavior: + widget.keyboardDismissBehavior, itemBuilder: widget.itemBuilder, separatorBuilder: widget.separatorBuilder, itemCount: widget.itemCount, diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index a91c44db..b2ea57f6 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -171,8 +171,13 @@ class MessageListView extends StatefulWidget { this.reverse = true, this.paginationLimit = 20, this.paginationLoadingIndicatorBuilder, + this.keyboardDismissBehavior = ScrollViewKeyboardDismissBehavior.onDrag, }) : super(key: key); + /// [ScrollViewKeyboardDismissBehavior] the defines how this [PositionedList] will + /// dismiss the keyboard automatically. + final ScrollViewKeyboardDismissBehavior keyboardDismissBehavior; + /// Function used to build a custom message widget final MessageBuilder? messageBuilder; @@ -443,9 +448,6 @@ class _MessageListViewState extends State { childAnchor: Alignment.topCenter, message: statusString, child: LazyLoadScrollView( - onPageScrollStart: () { - //FocusScope.of(context).unfocus(); - }, onStartOfPage: () async { _inBetweenList = false; if (!_upToDate) { @@ -471,6 +473,7 @@ class _MessageListViewState extends State { key: (initialIndex != 0 && initialAlignment != 0) ? ValueKey('$initialIndex-$initialAlignment') : null, + keyboardDismissBehavior: widget.keyboardDismissBehavior, itemPositionsListener: _itemPositionListener, initialScrollIndex: initialIndex, initialAlignment: initialAlignment,