remember position on load older based on event id instead of scroll progress
This commit is contained in:
parent
1215be0b21
commit
cdcc34acaa
1 changed files with 37 additions and 23 deletions
|
|
@ -79,11 +79,14 @@ class RoomChat extends HookConsumerWidget {
|
||||||
final scrollController = useScrollController();
|
final scrollController = useScrollController();
|
||||||
final controllerData = ref.watch(controllerProvider);
|
final controllerData = ref.watch(controllerProvider);
|
||||||
|
|
||||||
final heightBeforeLoad = useState<double?>(null);
|
final topEventBeforeLoad = useState<String?>(null);
|
||||||
|
|
||||||
Future<void> loadOlder() async {
|
Future<void> loadOlder() async {
|
||||||
heightBeforeLoad.value = scrollController.position.maxScrollExtent;
|
if (controllerData
|
||||||
await notifier.loadOlder();
|
case AsyncData(:final value) || AsyncLoading(:final value?)) {
|
||||||
|
topEventBeforeLoad.value = value.firstOrNull?.eventId;
|
||||||
|
await notifier.loadOlder();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() {
|
useEffect(() {
|
||||||
|
|
@ -97,26 +100,37 @@ class RoomChat extends HookConsumerWidget {
|
||||||
}, [scrollController.hasClients]);
|
}, [scrollController.hasClients]);
|
||||||
|
|
||||||
useEffect(() {
|
useEffect(() {
|
||||||
if (!scrollController.hasClients || controllerData is! AsyncData) return;
|
if (controllerData case AsyncData(
|
||||||
|
:final value,
|
||||||
if (heightBeforeLoad.value != null) {
|
) when scrollController.hasClients) {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
if (topEventBeforeLoad.value != null) {
|
||||||
if (scrollController.hasClients) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
scrollController.jumpTo(
|
if (scrollController.hasClients) {
|
||||||
scrollController.position.maxScrollExtent -
|
final index = value.indexWhere(
|
||||||
heightBeforeLoad.value!,
|
(event) => event.eventId == topEventBeforeLoad.value,
|
||||||
);
|
);
|
||||||
}
|
if (index != -1) {
|
||||||
heightBeforeLoad.value = null;
|
listController.value.jumpToItem(
|
||||||
});
|
index: index,
|
||||||
} else if (scrollController.position.atEdge &&
|
scrollController: scrollController,
|
||||||
scrollController.position.pixels != 0) {
|
alignment: 0,
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
);
|
||||||
if (scrollController.hasClients) {
|
}
|
||||||
scrollController.jumpTo(scrollController.position.maxScrollExtent);
|
}
|
||||||
}
|
topEventBeforeLoad.value = null;
|
||||||
});
|
});
|
||||||
|
} else if (scrollController.position.atEdge &&
|
||||||
|
scrollController.position.pixels != 0) {
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
if (scrollController.hasClients) {
|
||||||
|
scrollController.jumpTo(
|
||||||
|
scrollController.position.maxScrollExtent,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}, [controllerData]);
|
}, [controllerData]);
|
||||||
|
|
||||||
|
|
@ -142,7 +156,7 @@ class RoomChat extends HookConsumerWidget {
|
||||||
|
|
||||||
scrollController.addListener(listener);
|
scrollController.addListener(listener);
|
||||||
return () => scrollController.removeListener(listener);
|
return () => scrollController.removeListener(listener);
|
||||||
}, [roomId]);
|
}, [roomId, controllerData]);
|
||||||
|
|
||||||
final composerNode = useFocusNode(
|
final composerNode = useFocusNode(
|
||||||
onKeyEvent: (_, event) {
|
onKeyEvent: (_, event) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue