viewer: stabilized widget tree for top overlay when switching from single to multi entry

This commit is contained in:
Thibault Deckers 2022-05-24 18:05:56 +09:00
parent 2c5451776a
commit 7e11a397c6
2 changed files with 63 additions and 86 deletions

View file

@ -3,7 +3,6 @@ import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/themes.dart'; import 'package:aves/theme/themes.dart';
import 'package:aves/widgets/common/fx/blurred.dart'; import 'package:aves/widgets/common/fx/blurred.dart';
import 'package:aves/widgets/viewer/multipage/conductor.dart'; import 'package:aves/widgets/viewer/multipage/conductor.dart';
import 'package:aves/widgets/viewer/multipage/controller.dart';
import 'package:aves/widgets/viewer/overlay/details.dart'; import 'package:aves/widgets/viewer/overlay/details.dart';
import 'package:aves/widgets/viewer/overlay/minimap.dart'; import 'package:aves/widgets/viewer/overlay/minimap.dart';
import 'package:aves/widgets/viewer/page_entry_builder.dart'; import 'package:aves/widgets/viewer/page_entry_builder.dart';
@ -32,32 +31,10 @@ class ViewerTopOverlay extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
late Widget child; final multiPageController = mainEntry.isMultiPage ? context.read<MultiPageConductor>().getController(mainEntry) : null;
return PageEntryBuilder(
if (mainEntry.isMultiPage) {
final multiPageController = context.read<MultiPageConductor>().getController(mainEntry);
child = PageEntryBuilder(
multiPageController: multiPageController, multiPageController: multiPageController,
builder: (pageEntry) => _buildOverlay( builder: (pageEntry) {
context,
mainEntry,
pageEntry: pageEntry,
multiPageController: multiPageController,
),
);
} else {
child = _buildOverlay(context, mainEntry);
}
return child;
}
Widget _buildOverlay(
BuildContext context,
AvesEntry mainEntry, {
AvesEntry? pageEntry,
MultiPageController? multiPageController,
}) {
pageEntry ??= mainEntry; pageEntry ??= mainEntry;
final showInfo = settings.showOverlayInfo; final showInfo = settings.showOverlayInfo;
@ -111,5 +88,7 @@ class ViewerTopOverlay extends StatelessWidget {
) )
], ],
); );
},
);
} }
} }

View file

@ -16,20 +16,18 @@ class PageEntryBuilder extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final controller = multiPageController; final controller = multiPageController;
return controller != null return StreamBuilder<MultiPageInfo?>(
? StreamBuilder<MultiPageInfo?>( stream: controller != null ? controller.infoStream : Stream.value(null),
stream: controller.infoStream,
builder: (context, snapshot) { builder: (context, snapshot) {
final multiPageInfo = controller.info; final multiPageInfo = controller?.info;
return ValueListenableBuilder<int?>( return ValueListenableBuilder<int?>(
valueListenable: controller.pageNotifier, valueListenable: controller?.pageNotifier ?? ValueNotifier(null),
builder: (context, page, child) { builder: (context, page, child) {
final pageEntry = multiPageInfo?.getPageEntryByIndex(page); final pageEntry = multiPageInfo?.getPageEntryByIndex(page);
return builder(pageEntry); return builder(pageEntry);
}, },
); );
}, },
) );
: builder(null);
} }
} }