import 'package:aves/model/collection_lens.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/widgets/fullscreen/image_view.dart'; import 'package:flutter/material.dart'; import 'package:photo_view/photo_view.dart'; import 'package:tuple/tuple.dart'; import 'package:video_player/video_player.dart'; class MultiImagePage extends StatefulWidget { final CollectionLens collection; final PageController pageController; final ValueChanged onPageChanged; final ValueChanged onScaleChanged; final VoidCallback onTap; final List> videoControllers; const MultiImagePage({ this.collection, this.pageController, this.onPageChanged, this.onScaleChanged, this.onTap, this.videoControllers, }); @override State createState() => MultiImagePageState(); } class MultiImagePageState extends State with AutomaticKeepAliveClientMixin { List get entries => widget.collection.sortedEntries; @override Widget build(BuildContext context) { super.build(context); const scrollDirection = Axis.horizontal; return PhotoViewGestureDetectorScope( axis: scrollDirection, child: PageView.builder( controller: widget.pageController, onPageChanged: widget.onPageChanged, itemCount: entries.length, itemBuilder: (context, index) { final entry = entries[index]; return ImageView( entry: entry, heroTag: widget.collection.heroTag(entry), onScaleChanged: widget.onScaleChanged, onTap: widget.onTap, videoControllers: widget.videoControllers, ); }, scrollDirection: scrollDirection, physics: const BouncingScrollPhysics(), ), ); } @override bool get wantKeepAlive => true; } class SingleImagePage extends StatefulWidget { final ImageEntry entry; final ValueChanged onScaleChanged; final VoidCallback onTap; final List> videoControllers; const SingleImagePage({ this.entry, this.onScaleChanged, this.onTap, this.videoControllers, }); @override State createState() => SingleImagePageState(); } class SingleImagePageState extends State with AutomaticKeepAliveClientMixin { @override Widget build(BuildContext context) { super.build(context); return ImageView( entry: widget.entry, onScaleChanged: widget.onScaleChanged, onTap: widget.onTap, videoControllers: widget.videoControllers, ); } @override bool get wantKeepAlive => true; }