From 08bd5a8ca84d8e8cb87fcec089847458197f8be9 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 19 Feb 2021 13:14:10 +0100 Subject: [PATCH 1/3] [core] add default pagination value + implement pagination in example --- .../example/lib/main.dart | 64 ++++++++++++------- .../lib/src/channel_list_core.dart | 5 +- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/packages/stream_chat_flutter_core/example/lib/main.dart b/packages/stream_chat_flutter_core/example/lib/main.dart index 458c0e24..08bf7024 100644 --- a/packages/stream_chat_flutter_core/example/lib/main.dart +++ b/packages/stream_chat_flutter_core/example/lib/main.dart @@ -67,6 +67,8 @@ class StreamExample extends StatelessWidget { /// [ChannelListCore] is a `builder` with callbacks for constructing UIs based /// on different scenarios. class HomeScreen extends StatelessWidget { + final channelListController = ChannelListController(); + @override Widget build(BuildContext context) { return Scaffold( @@ -75,6 +77,15 @@ class HomeScreen extends StatelessWidget { ), body: ChannelsBloc( child: ChannelListCore( + channelListController: channelListController, + filter: { + 'type': 'messaging', + 'members': { + r'$in': [ + StreamChatCore.of(context).user.id, + ] + } + }, emptyBuilder: (BuildContext context) { return Center( child: Text('Looks like you are not in any channels'), @@ -99,31 +110,36 @@ class HomeScreen extends StatelessWidget { BuildContext context, List channels, ) => - ListView.builder( - itemCount: channels.length, - itemBuilder: (BuildContext context, int index) { - final _item = channels[index]; - return ListTile( - title: Text(_item.name), - subtitle: Text(_item.state.lastMessage.text), - onTap: () { - /// Display a list of messages when the user taps on an item. - /// We can use [StreamChannel] to wrap our [MessageScreen] screen - /// with the selected channel. - /// - /// This allows us to use a built-in inherited widget for accessing - /// our `channel` later on. - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => StreamChannel( - channel: _item, - child: MessageScreen(), - ), - ), - ); - }, - ); + LazyLoadScrollView( + onEndOfPage: () async { + channelListController.paginateData(); }, + child: ListView.builder( + itemCount: channels.length, + itemBuilder: (BuildContext context, int index) { + final _item = channels[index]; + return ListTile( + title: Text(_item.name), + subtitle: Text(_item.state.lastMessage.text), + onTap: () { + /// Display a list of messages when the user taps on an item. + /// We can use [StreamChannel] to wrap our [MessageScreen] screen + /// with the selected channel. + /// + /// This allows us to use a built-in inherited widget for accessing + /// our `channel` later on. + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => StreamChannel( + channel: _item, + child: MessageScreen(), + ), + ), + ); + }, + ); + }, + ), ), ), ), diff --git a/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart b/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart index b77ef394..18a8e477 100644 --- a/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart +++ b/packages/stream_chat_flutter_core/lib/src/channel_list_core.dart @@ -64,7 +64,10 @@ class ChannelListCore extends StatefulWidget { this.filter, this.options, this.sort, - this.pagination, + this.pagination = const PaginationParams( + offset: 0, + limit: 25, + ), this.channelListController, }) : assert(errorBuilder != null), assert(emptyBuilder != null), From 6f60bb8abbab13c762bf5eb6027daaa3eca58859 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 19 Feb 2021 14:28:07 +0100 Subject: [PATCH 2/3] [core] update example --- .../example/lib/main.dart | 140 +++++++++++------- 1 file changed, 83 insertions(+), 57 deletions(-) diff --git a/packages/stream_chat_flutter_core/example/lib/main.dart b/packages/stream_chat_flutter_core/example/lib/main.dart index 08bf7024..aa705db1 100644 --- a/packages/stream_chat_flutter_core/example/lib/main.dart +++ b/packages/stream_chat_flutter_core/example/lib/main.dart @@ -120,7 +120,17 @@ class HomeScreen extends StatelessWidget { final _item = channels[index]; return ListTile( title: Text(_item.name), - subtitle: Text(_item.state.lastMessage.text), + subtitle: StreamBuilder( + stream: _item.state.lastMessageStream, + initialData: _item.state.lastMessage, + builder: (context, snapshot) { + if (snapshot.hasData) { + return Text(snapshot.data.text); + } + + return SizedBox(); + }, + ), onTap: () { /// Display a list of messages when the user taps on an item. /// We can use [StreamChannel] to wrap our [MessageScreen] screen @@ -161,6 +171,7 @@ class MessageScreen extends StatefulWidget { class _MessageScreenState extends State { TextEditingController _controller; ScrollController _scrollController; + final messageListController = MessageListController(); @override void initState() { @@ -191,68 +202,83 @@ class _MessageScreenState extends State { final channel = StreamChannel.of(context).channel; return Scaffold( appBar: AppBar( - title: Text(channel.name), + title: StreamBuilder>( + initialData: channel.state.typingEvents, + stream: channel.state.typingEventsStream, + builder: (context, snapshot) { + if (snapshot.hasData && snapshot.data.isNotEmpty) { + return Text('${snapshot.data.first.name} is typing...'); + } + return SizedBox(); + }, + ), ), body: SafeArea( child: Column( children: [ Expanded( - child: MessageListCore( - emptyBuilder: (BuildContext context) { - return Center( - child: Text('Nothing here yet'), - ); - }, - loadingBuilder: (BuildContext context) { - return Center( - child: SizedBox( - height: 100.0, - width: 100.0, - child: CircularProgressIndicator(), - ), - ); - }, - messageListBuilder: ( - BuildContext context, - List messages, - ) { - return ListView.builder( - controller: _scrollController, - itemCount: messages.length, - reverse: true, - itemBuilder: (BuildContext context, int index) { - final item = messages[index]; - final client = StreamChatCore.of(context).client; - if (item.user.id == client.uid) { - return Align( - alignment: Alignment.centerRight, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text(item.text), - ), - ); - } else { - return Align( - alignment: Alignment.centerLeft, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Text(item.text), - ), - ); - } - }, - ); - }, - errorWidgetBuilder: (BuildContext context, error) { - print(error?.toString()); - return Center( - child: SizedBox( - height: 100.0, - width: 100.0, - child: Text('Oh no, an error occured. Please see logs.'), - ), - ); + child: LazyLoadScrollView( + onEndOfPage: () async { + messageListController.paginateData(); }, + child: MessageListCore( + emptyBuilder: (BuildContext context) { + return Center( + child: Text('Nothing here yet'), + ); + }, + loadingBuilder: (BuildContext context) { + return Center( + child: SizedBox( + height: 100.0, + width: 100.0, + child: CircularProgressIndicator(), + ), + ); + }, + messageListBuilder: ( + BuildContext context, + List messages, + ) { + return ListView.builder( + controller: _scrollController, + itemCount: messages.length, + reverse: true, + itemBuilder: (BuildContext context, int index) { + final item = messages[index]; + final client = StreamChatCore.of(context).client; + if (item.user.id == client.uid) { + return Align( + alignment: Alignment.centerRight, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text(item.text), + ), + ); + } else { + return Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text(item.text), + ), + ); + } + }, + ); + }, + errorWidgetBuilder: (BuildContext context, error) { + print(error?.toString()); + return Center( + child: SizedBox( + height: 100.0, + width: 100.0, + child: + Text('Oh no, an error occured. Please see logs.'), + ), + ); + }, + ), ), ), Padding( From 5845683eb1832ad64fe80ad547057947db1e9d57 Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Fri, 19 Feb 2021 15:34:16 +0100 Subject: [PATCH 3/3] fix error builder --- .../stream_chat_flutter/lib/src/message_search_list_view.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 94a79eaf..da1144b8 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 @@ -154,7 +154,7 @@ class _MessageSearchListViewState extends State { }, ); }, - errorBuilder: widget.emptyBuilder ?? + errorBuilder: widget.errorBuilder ?? (BuildContext context, dynamic error) { if (error is Error) { print((error).stackTrace);