From bd12ece9ea4581ae6fe4a47ef43904c24210128a Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Mon, 2 May 2022 12:44:28 +0200 Subject: [PATCH] PagedValueListenableBuilder --- .../paged_value_listenable_builder.mdx | 88 +++++++++++++++++++ .../lib/stream_chat_flutter_core.dart | 2 +- 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 docusaurus/docs/Flutter/stream_chat_flutter_core/paged_value_listenable_builder.mdx diff --git a/docusaurus/docs/Flutter/stream_chat_flutter_core/paged_value_listenable_builder.mdx b/docusaurus/docs/Flutter/stream_chat_flutter_core/paged_value_listenable_builder.mdx new file mode 100644 index 00000000..b527f7a0 --- /dev/null +++ b/docusaurus/docs/Flutter/stream_chat_flutter_core/paged_value_listenable_builder.mdx @@ -0,0 +1,88 @@ +--- +id: paged_value_listenable_builder +sidebar_position: 9 +title: PagedValueListenableBuilder +--- + +A Widget Whose Content Stays Synced With A `ValueNotifier` Of Type `PagedValue`. + +Find the pub.dev documentation [here](https://pub.dev/documentation/stream_chat_flutter_core/latest/stream_chat_flutter_core/PagedValueListenableBuilder-class.html) + +### Background + +Given a `PagedValueNotifier` implementation and a [builder] which builds widgets from +concrete values of `PagedValue`, this class will automatically register itself as a +listener of the [PagedValueNotifier] and call the [builder] with updated values +when the value changes. + +### Basic Example + +```dart +class UserNameValueNotifier extends PagedValueNotifier { + UserNameValueNotifier() : super(const PagedValue.loading()); + + @override + Future doInitialLoad() async { + // Imitating network delay + await Future.delayed(const Duration(seconds: 1)); + value = const PagedValue( + items: ['Sahil', 'Salvatore', 'Reuben'], + + /// Passing the key to load the next page + nextPageKey: nextPageKey, + ); + } + + @override + Future loadMore(int nextPageKey) async { + // Imitating network delay + await Future.delayed(const Duration(seconds: 1)); + final previousItems = value.asSuccess.items; + final newItems = previousItems + ['Deven', 'Sacha', 'Gordon']; + value = PagedValue( + items: newItems, + // Passing nextPageKey as null to indicate + // that there are no more items. + nextPageKey: null, + ); + } +} + +class _MyHomePageState extends State { + final pagedValueNotifier = UserNameValueNotifier(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: PagedValueListenableBuilder( + builder: (context, value, child) { + // This builder will only get called when the _counter + // is updated. + return value.when( + (userNames, nextPageKey, error) => Column( + children: [ + const Text('Usernames:'), + Expanded( + child: ListView( + children: userNames.map((it) => Text(it)).toList(), + ), + ), + if (nextPageKey != null) + TextButton( + child: const Text('Load more'), + onPressed: () => pagedValueNotifier.loadMore(nextPageKey), + ), + ], + ), + loading: () => CircularProgressIndicator(), + error: (e) => Text('Error: $e'), + ); + }, + valueListenable: pagedValueNotifier, + ), + ), + ); + } +} +``` diff --git a/packages/stream_chat_flutter_core/lib/stream_chat_flutter_core.dart b/packages/stream_chat_flutter_core/lib/stream_chat_flutter_core.dart index a5cd79df..34cbaaa1 100644 --- a/packages/stream_chat_flutter_core/lib/stream_chat_flutter_core.dart +++ b/packages/stream_chat_flutter_core/lib/stream_chat_flutter_core.dart @@ -12,7 +12,7 @@ export 'src/message_search_bloc.dart'; export 'src/message_search_list_core.dart' hide MessageSearchListCoreState; export 'src/message_text_field_controller.dart'; export 'src/paged_value_notifier.dart' - show PagedValueListenableBuilder, PagedValue; + show PagedValueListenableBuilder, PagedValue, PagedValueNotifier; export 'src/paged_value_scroll_view.dart'; export 'src/stream_channel.dart'; export 'src/stream_channel_list_controller.dart';