fix state disposal of sidebar on mobile layouts

This commit is contained in:
Henry Hiles 2025-11-23 13:22:01 -05:00
commit 0c58ae562d
No known key found for this signature in database
4 changed files with 43 additions and 14 deletions

View file

@ -0,0 +1,12 @@
import "package:flutter_riverpod/flutter_riverpod.dart";
class SelectedRoomController extends Notifier<int> {
@override
int build() => 0;
void set(int value) => state = value;
static final provider = NotifierProvider<SelectedRoomController, int>(
SelectedRoomController.new,
);
}

View file

@ -0,0 +1,12 @@
import "package:flutter_riverpod/flutter_riverpod.dart";
class SelectedSpaceController extends Notifier<int> {
@override
int build() => 0;
void set(int value) => state = value;
static final provider = NotifierProvider<SelectedSpaceController, int>(
SelectedSpaceController.new,
);
}

View file

@ -39,12 +39,11 @@ extension ToMessage on Event {
final replyId = relationshipType == RelationshipTypes.reply final replyId = relationshipType == RelationshipTypes.reply
? relationshipEventId ? relationshipEventId
: null; : null;
final sender = (await fetchSenderUser()) ?? senderFromMemoryOrFallback;
final metadata = { final metadata = {
"formatted": formattedText.isEmpty ? body : formattedText, "formatted": formattedText.isEmpty ? body : formattedText,
"eventType": type, "eventType": type,
"displayName": "displayName": sender.displayName ?? sender.id,
senderFromMemoryOrFallback.displayName ??
senderFromMemoryOrFallback.id,
"txnId": transactionId, "txnId": transactionId,
}; };

View file

@ -1,8 +1,9 @@
import "package:collection/collection.dart"; import "package:collection/collection.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/current_room_controller.dart"; import "package:nexus/controllers/current_room_controller.dart";
import "package:nexus/controllers/selected_room_controller.dart";
import "package:nexus/controllers/selected_space_controller.dart";
import "package:nexus/controllers/spaces_controller.dart"; import "package:nexus/controllers/spaces_controller.dart";
import "package:nexus/helpers/extension_helper.dart"; import "package:nexus/helpers/extension_helper.dart";
import "package:nexus/pages/settings_page.dart"; import "package:nexus/pages/settings_page.dart";
@ -14,8 +15,13 @@ class Sidebar extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final selectedSpace = useState(0); final selectedSpaceProvider = SelectedSpaceController.provider;
final selectedRoom = useState(0); final selectedSpace = ref.watch(selectedSpaceProvider);
final selectedSpaceNotifier = ref.watch(selectedSpaceProvider.notifier);
final selectedRoomController = SelectedRoomController.provider;
final selectedRoom = ref.watch(selectedRoomController);
final selectedRoomNotifier = ref.watch(selectedRoomController.notifier);
return Drawer( return Drawer(
shape: Border(), shape: Border(),
@ -32,11 +38,11 @@ class Sidebar extends HookConsumerWidget {
data: (spaces) => NavigationRail( data: (spaces) => NavigationRail(
scrollable: true, scrollable: true,
onDestinationSelected: (value) { onDestinationSelected: (value) {
selectedSpace.value = value; selectedRoomNotifier.set(0);
selectedRoom.value = 0; selectedSpaceNotifier.set(value);
ref ref
.watch(CurrentRoomController.provider.notifier) .watch(CurrentRoomController.provider.notifier)
.set(spaces[selectedSpace.value].children[0]); .set(spaces[value].children[0]);
}, },
destinations: spaces destinations: spaces
.map( .map(
@ -59,7 +65,7 @@ class Sidebar extends HookConsumerWidget {
), ),
) )
.toList(), .toList(),
selectedIndex: selectedSpace.value, selectedIndex: selectedSpace,
trailingAtBottom: true, trailingAtBottom: true,
trailing: Padding( trailing: Padding(
padding: EdgeInsets.symmetric(vertical: 16), padding: EdgeInsets.symmetric(vertical: 16),
@ -77,7 +83,7 @@ class Sidebar extends HookConsumerWidget {
.watch(SpacesController.provider) .watch(SpacesController.provider)
.betterWhen( .betterWhen(
data: (spaces) { data: (spaces) {
final space = spaces[selectedSpace.value]; final space = spaces[selectedSpace];
return Scaffold( return Scaffold(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
appBar: AppBar( appBar: AppBar(
@ -99,7 +105,7 @@ class Sidebar extends HookConsumerWidget {
extended: true, extended: true,
selectedIndex: space.children.isEmpty selectedIndex: space.children.isEmpty
? null ? null
: selectedRoom.value, : selectedRoom,
destinations: space.children destinations: space.children
.map( .map(
(room) => NavigationRailDestination( (room) => NavigationRailDestination(
@ -109,7 +115,7 @@ class Sidebar extends HookConsumerWidget {
child: AvatarOrHash( child: AvatarOrHash(
room.avatar, room.avatar,
room.title, room.title,
fallback: selectedSpace.value == 1 fallback: selectedSpace == 1
? null ? null
: Icon(Icons.numbers), : Icon(Icons.numbers),
headers: space.client.headers, headers: space.client.headers,
@ -119,7 +125,7 @@ class Sidebar extends HookConsumerWidget {
) )
.toList(), .toList(),
onDestinationSelected: (value) { onDestinationSelected: (value) {
selectedRoom.value = value; selectedRoomNotifier.set(value);
ref ref
.watch(CurrentRoomController.provider.notifier) .watch(CurrentRoomController.provider.notifier)
.set(space.children[value]); .set(space.children[value]);