fix state disposal of sidebar on mobile layouts
This commit is contained in:
parent
6dafcfad30
commit
0c58ae562d
4 changed files with 43 additions and 14 deletions
12
lib/controllers/selected_room_controller.dart
Normal file
12
lib/controllers/selected_room_controller.dart
Normal 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,
|
||||||
|
);
|
||||||
|
}
|
||||||
12
lib/controllers/selected_space_controller.dart
Normal file
12
lib/controllers/selected_space_controller.dart
Normal 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,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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]);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue