diff --git a/packages/stream_chat/CHANGELOG.md b/packages/stream_chat/CHANGELOG.md index c1537e5c..88f3ee19 100644 --- a/packages/stream_chat/CHANGELOG.md +++ b/packages/stream_chat/CHANGELOG.md @@ -6,6 +6,8 @@ update message with `type: reply`. - [[#1724]](https://github.com/GetStream/stream-chat-flutter/issues/1724) Fixed sendFile error on `AttachmentFile` with `bytes` and no `name`. +- [[#1753]](https://github.com/GetStream/stream-chat-flutter/issues/1753) Fixed Unhandled null + check operator exception when user is removed from a channel. ## 6.8.0 diff --git a/packages/stream_chat/lib/src/client/client.dart b/packages/stream_chat/lib/src/client/client.dart index 4e4fc5e4..79bf1741 100644 --- a/packages/stream_chat/lib/src/client/client.dart +++ b/packages/stream_chat/lib/src/client/client.dart @@ -1658,7 +1658,7 @@ class ClientState { ) .listen((event) async { final isCurrentUser = event.user!.id == currentUser!.id; - if (isCurrentUser) { + if (isCurrentUser && event.channel != null) { final eventChannel = event.channel!; await _client.chatPersistenceClient ?.deleteChannels([eventChannel.cid]); diff --git a/packages/stream_chat_flutter/example/lib/debug/actions/add_user.dart b/packages/stream_chat_flutter/example/lib/debug/actions/add_user.dart new file mode 100644 index 00000000..74fe2624 --- /dev/null +++ b/packages/stream_chat_flutter/example/lib/debug/actions/add_user.dart @@ -0,0 +1,47 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; + +import 'package:stream_chat_flutter_example/debug/error_dialog.dart'; + +class DebugAddUser extends StatelessWidget { + const DebugAddUser({ + super.key, + required this.client, + required this.channel, + }); + + final StreamChatClient client; + final Channel channel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8), + child: TextField( + decoration: const InputDecoration( + labelText: 'Add User', + hintText: 'User Id', + isDense: true, + border: OutlineInputBorder(), + ), + onSubmitted: (value) async { + final userId = value.trim(); + try { + debugPrint('[addUser] userId: $userId'); + final result = await client.addChannelMembers( + channel.id!, + channel.type, + [userId], + ); + debugPrint('[addUser] result: $result'); + } catch (e) { + debugPrint('[addUser] failed: $e'); + showErrorDialog(context, e, 'Add User'); + } + }, + ), + ); + } +} diff --git a/packages/stream_chat_flutter/example/lib/debug/actions/remove_user.dart b/packages/stream_chat_flutter/example/lib/debug/actions/remove_user.dart new file mode 100644 index 00000000..9aee373c --- /dev/null +++ b/packages/stream_chat_flutter/example/lib/debug/actions/remove_user.dart @@ -0,0 +1,47 @@ +// ignore_for_file: public_member_api_docs + +import 'package:flutter/material.dart'; +import 'package:stream_chat_flutter/stream_chat_flutter.dart'; + +import 'package:stream_chat_flutter_example/debug/error_dialog.dart'; + +class DebugRemoveUser extends StatelessWidget { + const DebugRemoveUser({ + super.key, + required this.client, + required this.channel, + }); + + final StreamChatClient client; + final Channel channel; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8), + child: TextField( + decoration: const InputDecoration( + labelText: 'Remove User', + hintText: 'User Id', + isDense: true, + border: OutlineInputBorder(), + ), + onSubmitted: (value) async { + final userId = value.trim(); + try { + debugPrint('[removeUser] userId: $userId'); + final result = await client.removeChannelMembers( + channel.id!, + channel.type, + [userId], + ); + debugPrint('[removeUser] result: $result'); + } catch (e) { + debugPrint('[removeUser] failed: $e'); + showErrorDialog(context, e, 'Remove User'); + } + }, + ), + ); + } +} diff --git a/packages/stream_chat_flutter/example/lib/debug/channel_page.dart b/packages/stream_chat_flutter/example/lib/debug/channel_page.dart index b5e93cf5..a1d4b6a4 100644 --- a/packages/stream_chat_flutter/example/lib/debug/channel_page.dart +++ b/packages/stream_chat_flutter/example/lib/debug/channel_page.dart @@ -4,9 +4,11 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:stream_chat_flutter/stream_chat_flutter.dart'; +import 'package:stream_chat_flutter_example/debug/actions/add_user.dart'; import 'package:stream_chat_flutter_example/debug/actions/ban_user.dart'; import 'package:stream_chat_flutter_example/debug/actions/mute_user.dart'; import 'package:stream_chat_flutter_example/debug/actions/remove_shadow_ban.dart'; +import 'package:stream_chat_flutter_example/debug/actions/remove_user.dart'; import 'package:stream_chat_flutter_example/debug/actions/shadow_ban.dart'; import 'package:stream_chat_flutter_example/debug/actions/unban_user.dart'; import 'package:stream_chat_flutter_example/debug/actions/unmute_user.dart'; @@ -82,6 +84,10 @@ class _DebugChannelPageState extends State { DebugShadowBan(client: _channel.client), const SizedBox(height: 8), DebugRemoveShadowBan(client: _channel.client), + const SizedBox(height: 8), + DebugAddUser(client: _channel.client, channel: _channel), + const SizedBox(height: 8), + DebugRemoveUser(client: _channel.client, channel: _channel), ], ), ),