From 99bede10d40bba61f36c8a9c39f0a608494003ec Mon Sep 17 00:00:00 2001 From: Jganenokk Date: Tue, 14 Jul 2026 16:32:16 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D1=80=D1=8B=D1=82=D0=B8=D1=8F=20=D1=84=D0=BE=D1=82=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/frontend/widgets/photo_viewer.dart | 43 ++++++++++++++++---------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/lib/frontend/widgets/photo_viewer.dart b/lib/frontend/widgets/photo_viewer.dart index 9496960..24a758c 100644 --- a/lib/frontend/widgets/photo_viewer.dart +++ b/lib/frontend/widgets/photo_viewer.dart @@ -105,6 +105,7 @@ class _PhotoViewerScreenState extends State { late PageController _controller; late List<_ViewerPhoto> _items; late int _index; + int _pager = 0; final Map _quarterTurns = {}; bool _feedLoaded = false; @@ -187,15 +188,28 @@ class _PhotoViewerScreenState extends State { return; } - _controller.dispose(); + _adoptFeed(items, at, feed); + } + + void _adoptFeed(List<_ViewerPhoto> items, int at, ChatPhotoFeed feed) { + final movesPage = at != _index; + final previous = _controller; + setState(() { _items = items; _index = at; _total = feed.total; _reachedEnd = feed.reachedEnd; _feedLoaded = true; - _controller = PageController(initialPage: at); + if (movesPage) { + _pager++; + _controller = PageController(initialPage: at); + } }); + + if (movesPage) { + WidgetsBinding.instance.addPostFrameCallback((_) => previous.dispose()); + } } Future _loadMore() async { @@ -209,21 +223,17 @@ class _PhotoViewerScreenState extends State { ); if (!mounted) return; - final known = _items.length; - final appended = - known > 0 && - feed.items.length > known && - feed.items[known - 1].dedupKey == _items.last.id; + final items = feed.items.map(_ViewerPhoto.fromFeed).toList(); + final at = items.indexWhere((i) => i.id == _current.id); + if (at == -1) { + setState(() { + _total = feed.total; + _reachedEnd = feed.reachedEnd; + }); + return; + } - setState(() { - if (appended) { - _items.addAll(feed.items.skip(known).map(_ViewerPhoto.fromFeed)); - } else { - _items = feed.items.map(_ViewerPhoto.fromFeed).toList(); - } - _total = feed.total; - _reachedEnd = feed.reachedEnd; - }); + _adoptFeed(items, at, feed); } finally { _loadingMore = false; } @@ -411,6 +421,7 @@ class _PhotoViewerScreenState extends State { children: [ Positioned.fill( child: PageView.builder( + key: ValueKey(_pager), controller: _controller, itemCount: _items.length, onPageChanged: _onPageChanged,