From b6c0dc0617f86d004abc0310f21f7af158b85350 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 5 Jun 2026 18:33:16 -0400 Subject: [PATCH] better handle when room is null --- lib/controllers/room_chat_controller.dart | 10 +++-- lib/widgets/room_appbar.dart | 45 ++++++++++++----------- lib/widgets/room_chat.dart | 20 +++++----- lib/widgets/sidebar.dart | 4 +- 4 files changed, 42 insertions(+), 37 deletions(-) diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 7cd79b8..07b3650 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -14,18 +14,20 @@ import "package:nexus/models/relation_type.dart"; import "package:nexus/models/requests/send_message_request.dart"; import "package:nexus/models/room.dart"; -class RoomChatController extends AsyncNotifier> { +class RoomChatController extends AsyncNotifier?> { final String roomId; RoomChatController(this.roomId); @override - Future> build() async { + Future?> build() async { final client = ref.watch(ClientController.provider.notifier); final room = ref.watch( RoomsController.provider.select((rooms) => rooms[roomId]), ); - if (!room!.hasFetchedState) { + if (room == null) return null; + + if (!room.hasFetchedState) { final state = await client.getRoomState(.new(roomId: roomId)); await ref.read(RoomsController.provider.notifier).addState(roomId, state); @@ -214,7 +216,7 @@ class RoomChatController extends AsyncNotifier> { } static final provider = AsyncNotifierProvider.family - .autoDispose, String>( + .autoDispose?, String>( RoomChatController.new, ); } diff --git a/lib/widgets/room_appbar.dart b/lib/widgets/room_appbar.dart index d16c2df..e1d5708 100644 --- a/lib/widgets/room_appbar.dart +++ b/lib/widgets/room_appbar.dart @@ -1,4 +1,3 @@ -import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter/material.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/rooms_controller.dart"; @@ -93,13 +92,15 @@ class RoomAppbar extends ConsumerWidget implements PreferredSizeWidget { ), ), ), - leading: isDesktop && room != null - ? AvatarOrHash( - room.metadata?.avatar, - room.metadata?.name ?? "Unnamed Room", - height: 24, - fallback: Icon(Icons.numbers), - ) + leading: isDesktop + ? room == null + ? null + : AvatarOrHash( + room.metadata?.avatar, + room.metadata?.name ?? "Unnamed Room", + height: 24, + fallback: Icon(Icons.numbers), + ) : DrawerButton(onPressed: () => onOpenDrawer(context)), scrolledUnderElevation: 0, title: room == null @@ -123,19 +124,21 @@ class RoomAppbar extends ConsumerWidget implements PreferredSizeWidget { ), ], ), - actions: [ - IconButton( - onPressed: null, - icon: Icon(Icons.push_pin), - tooltip: "Open pinned messages", - ), - IconButton( - onPressed: () => onOpenMemberList?.call(context), - tooltip: "Open member list", - icon: Icon(Icons.people), - ), - if (room != null) RoomMenu(room), - ].toIList(), + actions: room == null + ? .new() + : .new([ + IconButton( + onPressed: null, + icon: Icon(Icons.push_pin), + tooltip: "Open pinned messages", + ), + IconButton( + onPressed: () => onOpenMemberList?.call(context), + tooltip: "Open member list", + icon: Icon(Icons.people), + ), + RoomMenu(room), + ]), ); } } diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index beab387..2ab2cf7 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -50,6 +50,12 @@ class RoomChat extends HookConsumerWidget { final userId = ref.watch(ClientStateController.provider)?.userId; final theme = Theme.of(context); + final nothing = Center( + child: Text( + "Nothing to see here...", + style: theme.textTheme.headlineMedium, + ), + ); if (userId == null || this.roomId == null) { return Scaffold( appBar: RoomAppbar( @@ -58,12 +64,7 @@ class RoomChat extends HookConsumerWidget { onOpenDrawer: (_) => Scaffold.of(context).openDrawer(), onOpenMemberList: null, ), - body: Center( - child: Text( - "Nothing to see here...", - style: theme.textTheme.headlineMedium, - ), - ), + body: nothing, ); } @@ -81,7 +82,7 @@ class RoomChat extends HookConsumerWidget { final topEventBeforeLoad = useState(null); Future loadOlder() async { - if (controllerData case AsyncData(:final value)) { + if (controllerData case AsyncData(:final value?)) { topEventBeforeLoad.value = value.firstOrNull?.eventId; await notifier.loadOlder(); } @@ -105,7 +106,7 @@ class RoomChat extends HookConsumerWidget { useEffect(() { if (controllerData case AsyncData( - :final value, + :final value?, ) when scrollController.hasClients) { if (topEventBeforeLoad.value != null) { WidgetsBinding.instance.addPostFrameCallback((_) { @@ -401,7 +402,7 @@ class RoomChat extends HookConsumerWidget { child: Padding( padding: .symmetric(horizontal: 12), child: switch (controllerData) { - AsyncData(:final value) || + AsyncData(:final value?) || AsyncLoading(:final value?) => CustomScrollView( controller: scrollController, slivers: [ @@ -467,6 +468,7 @@ class RoomChat extends HookConsumerWidget { ), ], ), + AsyncData() => nothing, AsyncLoading() => Loading(), AsyncError(:final error, :final stackTrace) => ErrorDialog(error, stackTrace), diff --git a/lib/widgets/sidebar.dart b/lib/widgets/sidebar.dart index 3217173..dcbb671 100644 --- a/lib/widgets/sidebar.dart +++ b/lib/widgets/sidebar.dart @@ -39,9 +39,7 @@ class Sidebar extends HookConsumerWidget { (room) => room.metadata?.id == selectedRoomId, ); final selectedRoomIndex = indexOfSelectedRoom == -1 - ? selectedSpace.children.isEmpty - ? null - : 0 + ? null : indexOfSelectedRoom; return Drawer(