From 7d362db390d00bde1b0f2a1af4e998bda218a2f8 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Fri, 17 Sep 2021 18:34:00 +0530 Subject: [PATCH] fix(ui): check scrollController is attached before calling jump. --- .../lib/src/message_list_view.dart | 10 ++-- .../test/src/message_list_view_test.dart | 49 +++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 packages/stream_chat_flutter/test/src/message_list_view_test.dart 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 e325598d..c6786a4b 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -1199,10 +1199,12 @@ class _MessageListViewState extends State { initialAlignment = _initialAlignment; WidgetsBinding.instance!.addPostFrameCallback((timeStamp) { - _scrollController?.jumpTo( - index: initialIndex, - alignment: initialAlignment, - ); + if (_scrollController?.isAttached ?? false) { + _scrollController?.jumpTo( + index: initialIndex, + alignment: initialAlignment, + ); + } }); _messageNewListener = diff --git a/packages/stream_chat_flutter/test/src/message_list_view_test.dart b/packages/stream_chat_flutter/test/src/message_list_view_test.dart new file mode 100644 index 00000000..8217f6de --- /dev/null +++ b/packages/stream_chat_flutter/test/src/message_list_view_test.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; + +import 'mocks.dart'; + +void main() { + late StreamChatClient client; + late Channel channel; + + setUp(() { + client = MockClient(); + channel = MockChannel(); + when(() => channel.on(any(), any(), any(), any())) + .thenAnswer((_) => const Stream.empty()); + final channelClientState = MockChannelState(); + when(() => channel.state).thenReturn(channelClientState); + when(() => channelClientState.threadsStream) + .thenAnswer((_) => const Stream.empty()); + when(() => channelClientState.messagesStream) + .thenAnswer((_) => const Stream.empty()); + when(() => channelClientState.messages).thenReturn([]); + when(() => channelClientState.isUpToDate).thenReturn(true); + }); + + // https://github.com/GetStream/stream-chat-flutter/issues/674 + testWidgets('renders empty message list view', (tester) async { + const emptyWidgetKey = Key('empty_widget'); + + await tester.pumpWidget( + MaterialApp( + home: StreamChat( + client: client, + child: StreamChannel( + channel: channel, + child: MessageListView( + emptyBuilder: (_) => Container(key: emptyWidgetKey), + ), + ), + ), + ), + ); + await tester.pumpAndSettle(); + + expect(find.byType(MessageListView), findsOneWidget); + expect(find.byKey(emptyWidgetKey), findsOneWidget); + }); +}