Added a new message list controller

This commit is contained in:
Deven Joshi
2021-05-11 10:11:38 +05:30
parent b3ec54ae48
commit 4c11dca792
2 changed files with 13 additions and 7 deletions
+4 -4
View File
@@ -79,21 +79,21 @@ class HomeScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final messages = channel.state!.channelStateStream; final messages = channel.state!.messagesStream;
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text('Channel: ${channel.id}'), title: Text('Channel: ${channel.id}'),
), ),
body: SafeArea( body: SafeArea(
child: StreamBuilder<ChannelState?>( child: StreamBuilder<List<Message>?>(
stream: messages, stream: messages,
builder: ( builder: (
BuildContext context, BuildContext context,
AsyncSnapshot<ChannelState?> snapshot, AsyncSnapshot<List<Message>?> snapshot,
) { ) {
if (snapshot.hasData && snapshot.data != null) { if (snapshot.hasData && snapshot.data != null) {
return MessageView( return MessageView(
messages: snapshot.data!.messages.reversed.toList(), messages: snapshot.data!.reversed.toList(),
channel: channel, channel: channel,
); );
} else if (snapshot.hasError) { } else if (snapshot.hasError) {
@@ -2,7 +2,7 @@ import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:math'; import 'dart:math';
import 'package:collection/collection.dart' show IterableExtension; import 'package:collection/collection.dart' show IterableExtension, ListEquality;
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:rxdart/rxdart.dart'; import 'package:rxdart/rxdart.dart';
@@ -1296,6 +1296,8 @@ class ChannelClientState {
_channelStateController = BehaviorSubject.seeded(channelState); _channelStateController = BehaviorSubject.seeded(channelState);
_messageListController = BehaviorSubject.seeded(channelState.messages);
_listenTypingEvents(); _listenTypingEvents();
_listenMessageNew(); _listenMessageNew();
@@ -1601,8 +1603,7 @@ class ChannelClientState {
List<Message> get messages => _channelState.messages; List<Message> get messages => _channelState.messages;
/// Channel message list as a stream /// Channel message list as a stream
Stream<List<Message>?> get messagesStream => Stream<List<Message>?> get messagesStream => _messageListController.stream;
channelStateStream.map((cs) => cs.messages);
/// Channel pinned message list /// Channel pinned message list
List<Message>? get pinnedMessages => _channelState.pinnedMessages.toList(); List<Message>? get pinnedMessages => _channelState.pinnedMessages.toList();
@@ -1772,10 +1773,14 @@ class ChannelClientState {
/// The channel state related to this client /// The channel state related to this client
ChannelState get channelState => _channelStateController.value!; ChannelState get channelState => _channelStateController.value!;
late BehaviorSubject<ChannelState> _channelStateController; late BehaviorSubject<ChannelState> _channelStateController;
late BehaviorSubject<List<Message>> _messageListController;
final Debounce _debouncedUpdatePersistenceChannelState; final Debounce _debouncedUpdatePersistenceChannelState;
set _channelState(ChannelState v) { set _channelState(ChannelState v) {
if(!const ListEquality().equals(_messageListController.value, v.messages)) {
_messageListController.add(v.messages);
}
_channelStateController.add(v); _channelStateController.add(v);
_debouncedUpdatePersistenceChannelState.call([v]); _debouncedUpdatePersistenceChannelState.call([v]);
} }
@@ -1933,6 +1938,7 @@ class ChannelClientState {
retryQueue!.dispose(); retryQueue!.dispose();
_subscriptions.forEach((s) => s.cancel()); _subscriptions.forEach((s) => s.cancel());
_channelStateController.close(); _channelStateController.close();
_messageListController.close();
_isUpToDateController.close(); _isUpToDateController.close();
_threadsController.close(); _threadsController.close();
_cleaningTimer.cancel(); _cleaningTimer.cancel();