From 81b69e95bf1b9bea80470844a02a372994fa5753 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 29 Jun 2021 11:29:42 +0200 Subject: [PATCH 1/5] accept list controllers as params in ui package listviews --- .../lib/src/channel_list_view.dart | 10 +++++++++- .../lib/src/message_list_view.dart | 8 +++++++- .../lib/src/message_search_list_view.dart | 11 +++++++++-- .../stream_chat_flutter/lib/src/user_list_view.dart | 9 ++++++++- 4 files changed, 33 insertions(+), 5 deletions(-) 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..ddf3e753 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,8 @@ class ChannelListView extends StatefulWidget { class _ChannelListViewState extends State { final _slideController = SlidableController(); - final _channelListController = ChannelListController(); + late final _channelListController = + widget.channelListController ?? ChannelListController(); @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..e5063228 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,8 @@ class _MessageListViewState extends State { bool _inBetweenList = false; - final MessageListController _messageListController = MessageListController(); + late final MessageListController _messageListController = + widget.messageListController ?? MessageListController(); @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..c27e2c90 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,19 @@ 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 MessageSearchListController _messageSearchListController = + widget.messageSearchListController ?? MessageSearchListController(); @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..452cebfd 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,8 @@ class _UserListViewState extends State with WidgetsBindingObserver { bool get _isListView => widget.crossAxisCount == 1; - final UserListController _userListController = UserListController(); + late final UserListController _userListController = + widget.userListController ?? UserListController(); @override Widget build(BuildContext context) { From a9c7abb0d697ba52fa13fd3bec8e66ca243b25dd Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 29 Jun 2021 11:43:28 +0200 Subject: [PATCH 2/5] use getters --- packages/stream_chat_flutter/lib/src/channel_list_view.dart | 5 +++-- packages/stream_chat_flutter/lib/src/message_list_view.dart | 5 +++-- .../lib/src/message_search_list_view.dart | 5 +++-- packages/stream_chat_flutter/lib/src/user_list_view.dart | 5 +++-- 4 files changed, 12 insertions(+), 8 deletions(-) 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 ddf3e753..86712c8a 100644 --- a/packages/stream_chat_flutter/lib/src/channel_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/channel_list_view.dart @@ -201,8 +201,9 @@ class ChannelListView extends StatefulWidget { class _ChannelListViewState extends State { final _slideController = SlidableController(); - late final _channelListController = - widget.channelListController ?? ChannelListController(); + 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 e5063228..ad068c4d 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -352,8 +352,9 @@ class _MessageListViewState extends State { bool _inBetweenList = false; - late final MessageListController _messageListController = - widget.messageListController ?? MessageListController(); + 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 c27e2c90..50c1d47f 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 @@ -139,8 +139,9 @@ class MessageSearchListView extends StatefulWidget { } class _MessageSearchListViewState extends State { - late final MessageSearchListController _messageSearchListController = - widget.messageSearchListController ?? MessageSearchListController(); + 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 452cebfd..e027989e 100644 --- a/packages/stream_chat_flutter/lib/src/user_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/user_list_view.dart @@ -154,8 +154,9 @@ class _UserListViewState extends State with WidgetsBindingObserver { bool get _isListView => widget.crossAxisCount == 1; - late final UserListController _userListController = - widget.userListController ?? UserListController(); + final _defaultController = UserListController(); + UserListController get _userListController => + widget.userListController ?? _defaultController; @override Widget build(BuildContext context) { From 418c9ae64ec6976ce893378abdad4f58d016ea83 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 29 Jun 2021 11:45:59 +0200 Subject: [PATCH 3/5] use late --- packages/stream_chat_flutter/lib/src/channel_list_view.dart | 2 +- packages/stream_chat_flutter/lib/src/message_list_view.dart | 2 +- .../stream_chat_flutter/lib/src/message_search_list_view.dart | 2 +- packages/stream_chat_flutter/lib/src/user_list_view.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 86712c8a..b14e0b75 100644 --- a/packages/stream_chat_flutter/lib/src/channel_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/channel_list_view.dart @@ -201,7 +201,7 @@ class ChannelListView extends StatefulWidget { class _ChannelListViewState extends State { final _slideController = SlidableController(); - final _defaultController = ChannelListController(); + late final _defaultController = ChannelListController(); ChannelListController get _channelListController => widget.channelListController ?? _defaultController; 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 ad068c4d..e46f0d16 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -352,7 +352,7 @@ class _MessageListViewState extends State { bool _inBetweenList = false; - final _defaultController = MessageListController(); + late final _defaultController = MessageListController(); MessageListController get _messageListController => widget.messageListController ?? _defaultController; 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 50c1d47f..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 @@ -139,7 +139,7 @@ class MessageSearchListView extends StatefulWidget { } class _MessageSearchListViewState extends State { - final _defaultController = MessageSearchListController(); + late final _defaultController = MessageSearchListController(); MessageSearchListController get _messageSearchListController => widget.messageSearchListController ?? _defaultController; 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 e027989e..07b76f62 100644 --- a/packages/stream_chat_flutter/lib/src/user_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/user_list_view.dart @@ -154,7 +154,7 @@ class _UserListViewState extends State with WidgetsBindingObserver { bool get _isListView => widget.crossAxisCount == 1; - final _defaultController = UserListController(); + late final _defaultController = UserListController(); UserListController get _userListController => widget.userListController ?? _defaultController; From dde047b0e9bfdb1dcb5961faddc7dc1228c9fd9a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 29 Jun 2021 12:00:40 +0200 Subject: [PATCH 4/5] fix message and user list core controller setup --- .../lib/src/message_search_list_core.dart | 20 +++++++++++++++---- .../lib/src/user_list_core.dart | 19 ++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) 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..636a879f 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,22 @@ 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() { + widget.messageSearchListController!.loadData = loadData; + widget.messageSearchListController!.paginateData = paginateData; + } + + @override + void initState() { + super.initState(); + _setupController(); + } + @override Widget build(BuildContext context) => _buildListView(_messageSearchBloc!); @@ -176,6 +183,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..05a8432d 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,21 @@ 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() { + widget.userListController!.loadData = loadData; + widget.userListController!.paginateData = paginateData; + } + @override Widget build(BuildContext context) => _buildListView(); @@ -212,6 +219,10 @@ class UserListCoreState extends State oldWidget.pagination?.toJson().toString()) { loadData(); } + + if (widget.userListController != oldWidget.userListController) { + _setupController(); + } } } From ba927bf37928b1beb7d96e0e037530aeefb4cb84 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 29 Jun 2021 12:20:37 +0200 Subject: [PATCH 5/5] add null check --- .../lib/src/message_search_list_core.dart | 6 ++++-- .../stream_chat_flutter_core/lib/src/user_list_core.dart | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) 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 636a879f..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 @@ -120,8 +120,10 @@ class MessageSearchListCoreState extends State { } void _setupController() { - widget.messageSearchListController!.loadData = loadData; - widget.messageSearchListController!.paginateData = paginateData; + if (widget.messageSearchListController != null) { + widget.messageSearchListController!.loadData = loadData; + widget.messageSearchListController!.paginateData = paginateData; + } } @override 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 05a8432d..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 @@ -139,8 +139,10 @@ class UserListCoreState extends State } void _setupController() { - widget.userListController!.loadData = loadData; - widget.userListController!.paginateData = paginateData; + if (widget.userListController != null) { + widget.userListController!.loadData = loadData; + widget.userListController!.paginateData = paginateData; + } } @override