From f278a1dd38010dcb39479db5dcfebb4aaf6787fa Mon Sep 17 00:00:00 2001 From: otsmr Date: Fri, 19 Jun 2026 17:47:49 +0200 Subject: [PATCH] pre cache the chat list view --- .../visual/views/chats/chat_list.view.dart | 34 +++---------------- lib/src/visual/views/home.view.dart | 27 +++++++++------ .../visual/views/memories/memories.view.dart | 6 +++- .../views/settings/help/changelog.view.dart | 15 -------- 4 files changed, 27 insertions(+), 55 deletions(-) diff --git a/lib/src/visual/views/chats/chat_list.view.dart b/lib/src/visual/views/chats/chat_list.view.dart index e119d60d..2b7e3f30 100644 --- a/lib/src/visual/views/chats/chat_list.view.dart +++ b/lib/src/visual/views/chats/chat_list.view.dart @@ -1,9 +1,6 @@ import 'dart:async'; -import 'package:cryptography_plus/cryptography_plus.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; @@ -13,7 +10,6 @@ import 'package:twonly/src/database/twonly.db.dart'; import 'package:twonly/src/providers/purchases.provider.dart'; import 'package:twonly/src/services/mediafiles/mediafile.service.dart'; import 'package:twonly/src/services/subscription.service.dart'; -import 'package:twonly/src/services/user.service.dart'; import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/visual/components/avatar_icon.comp.dart'; @@ -32,7 +28,7 @@ class ChatListView extends StatefulWidget { State createState() => _ChatListViewState(); } -class _ChatListViewState extends State { +class _ChatListViewState extends State with AutomaticKeepAliveClientMixin { StreamSubscription? _userSub; StreamSubscription>? _contactsSub; StreamSubscription>? _contactsCountSub; @@ -126,32 +122,11 @@ class _ChatListViewState extends State { } } }); - - WidgetsBinding.instance.addPostFrameCallback((_) async { - final changeLog = await rootBundle.loadString('CHANGELOG.md'); - final changeLogHash = (await compute( - Sha256().hash, - changeLog.codeUnits, - )).bytes; - if (!userService.currentUser.hideChangeLog && - userService.currentUser.lastChangeLogHash.toString() != - changeLogHash.toString()) { - await UserService.update((u) { - u.lastChangeLogHash = changeLogHash; - }); - if (!mounted) return; - // only show changelog to people who already have contacts - // this prevents that this is shown directly after the user registered - if (_groupsNotPinned.isNotEmpty) { - await context.push( - Routes.settingsHelpChangelog, - extra: changeLog, - ); - } - } - }); } + @override + bool get wantKeepAlive => true; + @override void dispose() { _contactsSub?.cancel(); @@ -165,6 +140,7 @@ class _ChatListViewState extends State { @override Widget build(BuildContext context) { + super.build(context); final plan = context.watch().plan; return Scaffold( appBar: AppBar( diff --git a/lib/src/visual/views/home.view.dart b/lib/src/visual/views/home.view.dart index 5c308b77..975e78c6 100644 --- a/lib/src/visual/views/home.view.dart +++ b/lib/src/visual/views/home.view.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:app_links/app_links.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_sharing_intent/model/sharing_file.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -268,6 +269,10 @@ class HomeViewState extends State with WidgetsBindingObserver { setState(() { _offsetFromOne = 1.0 - (_homeViewPageController.page ?? 0); _offsetRatio = _offsetFromOne.abs(); + final pageIndex = _homeViewPageController.page?.round(); + if (pageIndex != null && pageIndex != _activePageIdx) { + _activePageIdx = pageIndex; + } }); } @@ -310,17 +315,19 @@ class HomeViewState extends State with WidgetsBindingObserver { NotificationListener( onNotification: _onPageView, child: Positioned.fill( - child: PageView( + child: CustomScrollView( + scrollDirection: Axis.horizontal, + physics: const PageScrollPhysics(), controller: _homeViewPageController, - onPageChanged: (index) { - setState(() { - _activePageIdx = index; - }); - }, - children: [ - const ChatListView(), - Container(), - const MemoriesView(), + scrollCacheExtent: const ScrollCacheExtent.viewport(1), + slivers: [ + SliverFillViewport( + delegate: SliverChildListDelegate([ + const ChatListView(), + Container(), + const MemoriesView(), + ]), + ), ], ), ), diff --git a/lib/src/visual/views/memories/memories.view.dart b/lib/src/visual/views/memories/memories.view.dart index 0013d330..195dc05f 100644 --- a/lib/src/visual/views/memories/memories.view.dart +++ b/lib/src/visual/views/memories/memories.view.dart @@ -21,7 +21,7 @@ class MemoriesView extends StatefulWidget { State createState() => MemoriesViewState(); } -class MemoriesViewState extends State { +class MemoriesViewState extends State with AutomaticKeepAliveClientMixin { late final MemoriesService _service; final ValueNotifier _activeMediaIdNotifier = ValueNotifier(null); final ScrollController _scrollController = ScrollController(); @@ -38,6 +38,9 @@ class MemoriesViewState extends State { _activeMediaIdNotifier.addListener(_onActiveMediaChanged); } + @override + bool get wantKeepAlive => true; + @override void dispose() { _activeMediaIdNotifier.removeListener(_onActiveMediaChanged); @@ -369,6 +372,7 @@ class MemoriesViewState extends State { @override Widget build(BuildContext context) { + super.build(context); return Scaffold( body: Stack( fit: StackFit.expand, diff --git a/lib/src/visual/views/settings/help/changelog.view.dart b/lib/src/visual/views/settings/help/changelog.view.dart index c4f05891..f9870c0e 100644 --- a/lib/src/visual/views/settings/help/changelog.view.dart +++ b/lib/src/visual/views/settings/help/changelog.view.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:twonly/locator.dart'; -import 'package:twonly/src/services/user.service.dart'; import 'package:twonly/src/utils/misc.dart'; List parseMarkdown(BuildContext context, String markdown) { @@ -107,20 +106,6 @@ class _ChangeLogViewState extends State { ), ), ), - bottomNavigationBar: BottomAppBar( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text(context.lang.openChangeLog), - Switch.adaptive( - value: !userService.currentUser.hideChangeLog, - onChanged: (_) => UserService.update( - (u) => u.hideChangeLog = !u.hideChangeLog, - ), - ), - ], - ), - ), ); }, );