From dc90e3874322530dec406f2ffb8ee3f8f12d6d6b Mon Sep 17 00:00:00 2001 From: Salvatore Giordano Date: Tue, 7 Apr 2020 10:14:00 +0200 Subject: [PATCH] remove channels bloc --- example/lib/main.dart | 47 +++++++++++------- lib/src/channel_list_view.dart | 28 +++++------ lib/src/channels_bloc.dart | 88 --------------------------------- lib/src/stream_chat.dart | 90 +++++++++++++++++++++++++++++++++- 4 files changed, 130 insertions(+), 123 deletions(-) delete mode 100644 lib/src/channels_bloc.dart diff --git a/example/lib/main.dart b/example/lib/main.dart index a4b343fe..38de0083 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -50,39 +50,48 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return MaterialApp( home: Container( - child: StreamChat( - client: client, - child: ChannelListPage(), - ), + child: ChannelListPage(client), ), ); } } class ChannelListPage extends StatelessWidget { + final Client client; + + ChannelListPage(this.client); + @override Widget build(BuildContext context) { return Scaffold( body: PageView( children: [ - ChannelListView( - filter: { - 'members': { - '\$in': [StreamChat.of(context).user.id], - } - }, - sort: [SortOption('last_message_at')], - pagination: PaginationParams( - limit: 20, + StreamChat( + client: client, + child: Builder( + builder: (context) => ChannelListView( + filter: { + 'members': { + '\$in': [StreamChat.of(context).user.id], + } + }, + sort: [SortOption('last_message_at')], + pagination: PaginationParams( + limit: 20, + ), + channelWidget: ChannelPage(), + ), ), - channelWidget: ChannelPage(), ), - ChannelListView( - sort: [SortOption('last_message_at')], - pagination: PaginationParams( - limit: 20, + StreamChat( + client: client, + child: ChannelListView( + sort: [SortOption('last_message_at')], + pagination: PaginationParams( + limit: 20, + ), + channelWidget: ChannelPage(), ), - channelWidget: ChannelPage(), ), ], ), diff --git a/lib/src/channel_list_view.dart b/lib/src/channel_list_view.dart index 13a43fd7..580d4d84 100644 --- a/lib/src/channel_list_view.dart +++ b/lib/src/channel_list_view.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:stream_chat/stream_chat.dart'; -import 'package:stream_chat_flutter/src/channels_bloc.dart'; import '../stream_chat_flutter.dart'; import 'channel_preview.dart'; @@ -100,16 +99,16 @@ class ChannelListView extends StatefulWidget { } class _ChannelListViewState extends State - with WidgetsBindingObserver, AutomaticKeepAliveClientMixin { + with WidgetsBindingObserver { final ScrollController _scrollController = ScrollController(); - ChannelsBloc channelsBloc; @override Widget build(BuildContext context) { - super.build(context); + final streamChat = StreamChat.of(context); + return RefreshIndicator( onRefresh: () async { - return channelsBloc.queryChannels( + return streamChat.queryChannels( filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination, @@ -117,7 +116,7 @@ class _ChannelListViewState extends State ); }, child: StreamBuilder>( - stream: channelsBloc.channelsStream, + stream: streamChat.channelsStream, builder: (context, snapshot) { if (snapshot.hasError) { if (snapshot.error is Error) { @@ -165,7 +164,7 @@ class _ChannelListViewState extends State ), FlatButton( onPressed: () { - channelsBloc.queryChannels( + streamChat.queryChannels( filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination, @@ -217,7 +216,7 @@ class _ChannelListViewState extends State if (i < channels.length) { final channel = channels[i]; - final channelClient = channelsBloc.channels.firstWhere( + final channelClient = streamChat.channels.firstWhere( (c) => c.cid == channel.cid, orElse: () => null, ); @@ -287,7 +286,7 @@ class _ChannelListViewState extends State Widget _buildQueryProgressIndicator(context, StreamChatState streamChat) { return StreamBuilder( - stream: channelsBloc.queryChannelsLoading, + stream: streamChat.queryChannelsLoading, initialData: false, builder: (context, snapshot) { if (snapshot.hasError) { @@ -322,11 +321,11 @@ class _ChannelListViewState extends State void _listenChannelPagination(StreamChatState streamChat) { if (_scrollController.position.maxScrollExtent == _scrollController.offset) { - channelsBloc.queryChannels( + streamChat.queryChannels( filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination.copyWith( - offset: channelsBloc.channels.length, + offset: streamChat.channels.length, ), options: widget.options, ); @@ -336,12 +335,12 @@ class _ChannelListViewState extends State @override void initState() { super.initState(); + final streamChat = StreamChat.of(context); - channelsBloc = ChannelsBloc(streamChat.client); WidgetsBinding.instance.addObserver(this); - channelsBloc.queryChannels( + streamChat.queryChannels( filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination, @@ -356,7 +355,7 @@ class _ChannelListViewState extends State @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { - channelsBloc.queryChannels( + StreamChat.of(context).queryChannels( filter: widget.filter, sortOptions: widget.sort, paginationParams: widget.pagination, @@ -369,7 +368,6 @@ class _ChannelListViewState extends State @override void dispose() { WidgetsBinding.instance.removeObserver(this); - channelsBloc.dispose(); super.dispose(); } diff --git a/lib/src/channels_bloc.dart b/lib/src/channels_bloc.dart deleted file mode 100644 index fa111710..00000000 --- a/lib/src/channels_bloc.dart +++ /dev/null @@ -1,88 +0,0 @@ -import 'dart:async'; - -import 'package:rxdart/rxdart.dart'; -import 'package:stream_chat/stream_chat.dart'; - -class ChannelsBloc { - final Client client; - StreamSubscription _newMessagesSubscription; - - ChannelsBloc(this.client) { - _newMessagesSubscription = client.on(EventType.messageNew).listen((e) { - final newChannels = List.from(channels ?? []); - final index = newChannels.indexWhere((c) => c.cid == e.cid); - if (index > 0) { - final channel = newChannels.removeAt(index); - newChannels.insert(0, channel); - _channelsController.add(newChannels); - } - }); - } - - /// The current channel list - List get channels => _channelsController.value; - - /// The current channel list as a stream - Stream> get channelsStream => _channelsController.stream; - - final BehaviorSubject _queryChannelsLoadingController = - BehaviorSubject.seeded(false); - - final BehaviorSubject> _channelsController = - BehaviorSubject.seeded([]); - - /// The stream notifying the state of queryChannel call - Stream get queryChannelsLoading => - _queryChannelsLoadingController.stream; - - /// Calls [client.queryChannels] updating [queryChannelsLoading] stream - Future queryChannels({ - Map filter, - List sortOptions, - PaginationParams paginationParams, - Map options, - bool onlyOffline = false, - }) async { - if (_queryChannelsLoadingController.value == true) { - return; - } - _queryChannelsLoadingController.sink.add(true); - - try { - final clear = paginationParams == null || - paginationParams.offset == null || - paginationParams.offset == 0; - final oldChannels = List.from(channels); - client - .queryChannels( - filter: filter, - sort: sortOptions, - options: options, - paginationParams: paginationParams, - onlyOffline: onlyOffline, - ) - .listen((channels) { - if (clear) { - _channelsController.add(channels); - } else { - final l = oldChannels + channels; - _channelsController.add(l); - } - }, onDone: () { - _queryChannelsLoadingController.sink.add(false); - }, onError: (err, stackTrace) { - print(err); - print(stackTrace); - _queryChannelsLoadingController.addError(err, stackTrace); - }); - } catch (err, stackTrace) { - _queryChannelsLoadingController.addError(err, stackTrace); - } - } - - void dispose() { - _channelsController.close(); - _queryChannelsLoadingController.close(); - _newMessagesSubscription.cancel(); - } -} diff --git a/lib/src/stream_chat.dart b/lib/src/stream_chat.dart index 915562f8..24412d52 100644 --- a/lib/src/stream_chat.dart +++ b/lib/src/stream_chat.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:rxdart/rxdart.dart'; import 'package:stream_chat/stream_chat.dart'; import 'package:stream_chat_flutter/src/stream_chat_theme.dart'; @@ -58,12 +59,15 @@ class StreamChat extends StatefulWidget { } } -class StreamChatState extends State with WidgetsBindingObserver { +class StreamChatState extends State + with WidgetsBindingObserver, AutomaticKeepAliveClientMixin { Client get client => widget.client; final GlobalKey _navigatorKey = GlobalKey(); @override Widget build(BuildContext context) { + super.build(context); + final theme = _getTheme(context, widget.streamChatThemeData); return StreamChatTheme( data: theme, @@ -175,9 +179,83 @@ class StreamChatState extends State with WidgetsBindingObserver { /// The current user as a stream Stream get userStream => widget.client.state.userStream; + /// The current channel list + List get channels => _channelsController.value; + + /// The current channel list as a stream + Stream> get channelsStream => _channelsController.stream; + + final BehaviorSubject _queryChannelsLoadingController = + BehaviorSubject.seeded(false); + + final BehaviorSubject> _channelsController = + BehaviorSubject.seeded([]); + + /// The stream notifying the state of queryChannel call + Stream get queryChannelsLoading => + _queryChannelsLoadingController.stream; + + /// Calls [client.queryChannels] updating [queryChannelsLoading] stream + Future queryChannels({ + Map filter, + List sortOptions, + PaginationParams paginationParams, + Map options, + bool onlyOffline = false, + }) async { + if (_queryChannelsLoadingController.value == true) { + return; + } + _queryChannelsLoadingController.sink.add(true); + + try { + final clear = paginationParams == null || + paginationParams.offset == null || + paginationParams.offset == 0; + final oldChannels = List.from(channels); + client + .queryChannels( + filter: filter, + sort: sortOptions, + options: options, + paginationParams: paginationParams, + onlyOffline: onlyOffline, + ) + .listen((channels) { + if (clear) { + _channelsController.add(channels); + } else { + final l = oldChannels + channels; + _channelsController.add(l); + } + }, onDone: () { + _queryChannelsLoadingController.sink.add(false); + }, onError: (err, stackTrace) { + print(err); + print(stackTrace); + _queryChannelsLoadingController.addError(err, stackTrace); + }); + } catch (err, stackTrace) { + _queryChannelsLoadingController.addError(err, stackTrace); + } + } + + StreamSubscription _newMessagesSubscription; + @override void initState() { super.initState(); + + _newMessagesSubscription = client.on(EventType.messageNew).listen((e) { + final newChannels = List.from(channels ?? []); + final index = newChannels.indexWhere((c) => c.cid == e.cid); + if (index > 0) { + final channel = newChannels.removeAt(index); + newChannels.insert(0, channel); + _channelsController.add(newChannels); + } + }); + WidgetsBinding.instance.addObserver(this); } @@ -196,6 +274,16 @@ class StreamChatState extends State with WidgetsBindingObserver { @override void dispose() { WidgetsBinding.instance.removeObserver(this); + + print('disposeeeeeeeeee'); + + _channelsController.close(); + _queryChannelsLoadingController.close(); + _newMessagesSubscription.cancel(); + super.dispose(); } + + @override + bool get wantKeepAlive => true; }