diff --git a/packages/stream_chat_flutter/lib/src/channel_list_view.dart b/packages/stream_chat_flutter/lib/src/channel_list_view.dart index d131c33b..b14e0b75 100644 --- a/packages/stream_chat_flutter/lib/src/channel_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/channel_list_view.dart @@ -89,6 +89,7 @@ class ChannelListView extends StatefulWidget { this.onMoreDetailsPressed, this.onDeletePressed, this.swipeActions, + this.channelListController, }) : super(key: key); /// If true a default swipe to action behaviour will be added to this widget @@ -187,6 +188,12 @@ class ChannelListView extends StatefulWidget { /// List of actions for slidable final List? swipeActions; + /// A [ChannelListController] allows reloading and pagination. + /// Use [ChannelListController.loadData] and + /// [ChannelListController.paginateData] respectively for reloading and + /// pagination. + final ChannelListController? channelListController; + @override _ChannelListViewState createState() => _ChannelListViewState(); } @@ -194,7 +201,9 @@ class ChannelListView extends StatefulWidget { class _ChannelListViewState extends State { final _slideController = SlidableController(); - final _channelListController = ChannelListController(); + late final _defaultController = ChannelListController(); + ChannelListController get _channelListController => + widget.channelListController ?? _defaultController; @override Widget build(BuildContext context) { 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 74942259..e46f0d16 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -172,6 +172,7 @@ class MessageListView extends StatefulWidget { this.usernameBuilder, this.showFloatingDateDivider = true, this.threadSeparatorBuilder, + this.messageListController, }) : super(key: key); /// Function used to build a custom message widget @@ -296,6 +297,10 @@ class MessageListView extends StatefulWidget { /// Builder used to build the thread separator in case it's a thread view final WidgetBuilder? threadSeparatorBuilder; + /// A [MessageListController] allows pagination. + /// Use [ChannelListController.paginateData] pagination. + final MessageListController? messageListController; + @override _MessageListViewState createState() => _MessageListViewState(); } @@ -347,7 +352,9 @@ class _MessageListViewState extends State { bool _inBetweenList = false; - final MessageListController _messageListController = MessageListController(); + late final _defaultController = MessageListController(); + MessageListController get _messageListController => + widget.messageListController ?? _defaultController; @override Widget build(BuildContext context) => MessageListCore( diff --git a/packages/stream_chat_flutter/lib/src/message_search_list_view.dart b/packages/stream_chat_flutter/lib/src/message_search_list_view.dart index 8b8a8dec..1a67702f 100644 --- a/packages/stream_chat_flutter/lib/src/message_search_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_search_list_view.dart @@ -68,6 +68,7 @@ class MessageSearchListView extends StatefulWidget { this.errorBuilder, this.loadingBuilder, this.childBuilder, + this.messageSearchListController, }) : super(key: key); /// Message String to search on @@ -127,13 +128,20 @@ class MessageSearchListView extends StatefulWidget { /// The builder that will be used in case of loading final WidgetBuilder? loadingBuilder; + /// A [MessageSearchListController] allows reloading and pagination. + /// Use [MessageSearchListController.loadData] and + /// [MessageSearchListController.paginateData] respectively for reloading and + /// pagination. + final MessageSearchListController? messageSearchListController; + @override _MessageSearchListViewState createState() => _MessageSearchListViewState(); } class _MessageSearchListViewState extends State { - final MessageSearchListController _messageSearchListController = - MessageSearchListController(); + late final _defaultController = MessageSearchListController(); + MessageSearchListController get _messageSearchListController => + widget.messageSearchListController ?? _defaultController; @override Widget build(BuildContext context) => MessageSearchListCore( diff --git a/packages/stream_chat_flutter/lib/src/user_list_view.dart b/packages/stream_chat_flutter/lib/src/user_list_view.dart index 85666413..07b76f62 100644 --- a/packages/stream_chat_flutter/lib/src/user_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/user_list_view.dart @@ -64,6 +64,7 @@ class UserListView extends StatefulWidget { this.emptyBuilder, this.loadingBuilder, this.listBuilder, + this.userListController, }) : assert( crossAxisCount == 1 || groupAlphabetically == false, 'Cannot group alphabetically when crossAxisCount > 1', @@ -140,6 +141,11 @@ class UserListView extends StatefulWidget { /// The builder used when the channel list is empty. final WidgetBuilder? emptyBuilder; + /// A [UserListController] allows reloading and pagination. + /// Use [UserListController.loadData] and [UserListController.paginateData] + /// respectively for reloading and pagination. + final UserListController? userListController; + @override _UserListViewState createState() => _UserListViewState(); } @@ -148,7 +154,9 @@ class _UserListViewState extends State with WidgetsBindingObserver { bool get _isListView => widget.crossAxisCount == 1; - final UserListController _userListController = UserListController(); + late final _defaultController = UserListController(); + UserListController get _userListController => + widget.userListController ?? _defaultController; @override Widget build(BuildContext context) { diff --git a/packages/stream_chat_flutter_core/lib/src/message_search_list_core.dart b/packages/stream_chat_flutter_core/lib/src/message_search_list_core.dart index a1eb5d68..d354daec 100644 --- a/packages/stream_chat_flutter_core/lib/src/message_search_list_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/message_search_list_core.dart @@ -114,15 +114,24 @@ class MessageSearchListCoreState extends State { if (newMessageSearchBloc != _messageSearchBloc) { _messageSearchBloc = newMessageSearchBloc; loadData(); - if (widget.messageSearchListController != null) { - widget.messageSearchListController!.loadData = loadData; - widget.messageSearchListController!.paginateData = paginateData; - } } super.didChangeDependencies(); } + void _setupController() { + if (widget.messageSearchListController != null) { + widget.messageSearchListController!.loadData = loadData; + widget.messageSearchListController!.paginateData = paginateData; + } + } + + @override + void initState() { + super.initState(); + _setupController(); + } + @override Widget build(BuildContext context) => _buildListView(_messageSearchBloc!); @@ -176,6 +185,11 @@ class MessageSearchListCoreState extends State { oldWidget.paginationParams?.toJson().toString()) { loadData(); } + + if (widget.messageSearchListController != + oldWidget.messageSearchListController) { + _setupController(); + } } } diff --git a/packages/stream_chat_flutter_core/lib/src/user_list_core.dart b/packages/stream_chat_flutter_core/lib/src/user_list_core.dart index e7deb356..db6b3586 100644 --- a/packages/stream_chat_flutter_core/lib/src/user_list_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/user_list_core.dart @@ -128,14 +128,23 @@ class UserListCoreState extends State if (newUsersBloc != _usersBloc) { _usersBloc = newUsersBloc; loadData(); - if (widget.userListController != null) { - widget.userListController!.loadData = loadData; - widget.userListController!.paginateData = paginateData; - } } super.didChangeDependencies(); } + @override + void initState() { + super.initState(); + _setupController(); + } + + void _setupController() { + if (widget.userListController != null) { + widget.userListController!.loadData = loadData; + widget.userListController!.paginateData = paginateData; + } + } + @override Widget build(BuildContext context) => _buildListView(); @@ -212,6 +221,10 @@ class UserListCoreState extends State oldWidget.pagination?.toJson().toString()) { loadData(); } + + if (widget.userListController != oldWidget.userListController) { + _setupController(); + } } }