minor fix

This commit is contained in:
Thibault Deckers 2021-07-16 09:50:18 +09:00
parent 66f902165d
commit c4e44183b0

View file

@ -18,6 +18,7 @@ import 'package:aves/widgets/viewer/entry_vertical_pager.dart';
import 'package:aves/widgets/viewer/hero.dart';
import 'package:aves/widgets/viewer/info/notifications.dart';
import 'package:aves/widgets/viewer/multipage/conductor.dart';
import 'package:aves/widgets/viewer/multipage/controller.dart';
import 'package:aves/widgets/viewer/overlay/bottom/common.dart';
import 'package:aves/widgets/viewer/overlay/bottom/panorama.dart';
import 'package:aves/widgets/viewer/overlay/bottom/video.dart';
@ -62,6 +63,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
EdgeInsets? _frozenViewInsets, _frozenViewPadding;
late VideoActionDelegate _videoActionDelegate;
final List<Tuple2<String, ValueNotifier<ViewState>>> _viewStateNotifiers = [];
final Map<MultiPageController, Future<void> Function()> _multiPageControllerPageListeners = {};
final ValueNotifier<HeroInfo?> _heroInfoNotifier = ValueNotifier(null);
bool _isEntryTracked = true;
@ -111,7 +113,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
_videoActionDelegate = VideoActionDelegate(
collection: collection,
);
_initEntryControllers();
_initEntryControllers(entry);
_registerWidget(widget);
WidgetsBinding.instance!.addObserver(this);
WidgetsBinding.instance!.addPostFrameCallback((_) => _initOverlay());
@ -129,6 +131,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
@override
void dispose() {
_cleanEntryControllers(_entryNotifier.value);
_videoActionDelegate.dispose();
_overlayAnimationController.dispose();
_overlayVisible.removeListener(_onOverlayVisibleChange);
@ -454,10 +457,11 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
final newEntry = _currentHorizontalPage < entries.length ? entries[_currentHorizontalPage] : null;
if (_entryNotifier.value == newEntry) return;
_cleanEntryControllers(_entryNotifier.value);
_entryNotifier.value = newEntry;
_isEntryTracked = false;
await _pauseVideoControllers();
await _initEntryControllers();
await _initEntryControllers(newEntry);
}
void _popVisual() {
@ -549,8 +553,7 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
// state controllers/monitors
Future<void> _initEntryControllers() async {
final entry = _entryNotifier.value;
Future<void> _initEntryControllers(AvesEntry? entry) async {
if (entry == null) return;
_initViewStateController(entry);
@ -562,6 +565,14 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
}
}
void _cleanEntryControllers(AvesEntry? entry) {
if (entry == null) return;
if (entry.isMultiPage) {
_cleanMultiPageController(entry);
}
}
void _initViewStateController(AvesEntry entry) {
final uri = entry.uri;
var controller = _viewStateNotifiers.firstWhereOrNull((kv) => kv.item1 == uri);
@ -617,11 +628,22 @@ class _EntryViewerStackState extends State<EntryViewerStack> with FeedbackMixin,
}
}
_multiPageControllerPageListeners[multiPageController] = _onPageChange;
multiPageController.pageNotifier.addListener(_onPageChange);
await _onPageChange();
}
}
Future<void> _cleanMultiPageController(AvesEntry entry) async {
final multiPageController = _multiPageControllerPageListeners.keys.firstWhereOrNull((v) => v.entry == entry);
if (multiPageController != null) {
final _onPageChange = _multiPageControllerPageListeners.remove(multiPageController);
if (_onPageChange != null) {
multiPageController.pageNotifier.removeListener(_onPageChange);
}
}
}
Future<void> _playVideo(AvesVideoController videoController, bool Function() isCurrent) async {
// video decoding may fail or have initial artifacts when the player initializes
// during this widget initialization (because of the page transition and hero animation?)