fullscreen: prevent vertical scroll when zoomed in

This commit is contained in:
Thibault Deckers 2019-07-28 18:44:19 +09:00
parent 1a6ed67893
commit 8759987dd7

View file

@ -23,6 +23,7 @@ class FullscreenPage extends StatefulWidget {
} }
class FullscreenPageState extends State<FullscreenPage> with SingleTickerProviderStateMixin { class FullscreenPageState extends State<FullscreenPage> with SingleTickerProviderStateMixin {
bool _isInitialScale = true;
int _currentHorizontalPage, _currentVerticalPage = 0; int _currentHorizontalPage, _currentVerticalPage = 0;
PageController _horizontalPager, _verticalPager; PageController _horizontalPager, _verticalPager;
ValueNotifier<bool> _overlayVisible = ValueNotifier(false); ValueNotifier<bool> _overlayVisible = ValueNotifier(false);
@ -62,6 +63,7 @@ class FullscreenPageState extends State<FullscreenPage> with SingleTickerProvide
PageView( PageView(
scrollDirection: Axis.vertical, scrollDirection: Axis.vertical,
controller: _verticalPager, controller: _verticalPager,
physics: _isInitialScale ? PageScrollPhysics() : NeverScrollableScrollPhysics(),
onPageChanged: (page) => setState(() => _currentVerticalPage = page), onPageChanged: (page) => setState(() => _currentVerticalPage = page),
children: [ children: [
ImagePage( ImagePage(
@ -69,6 +71,7 @@ class FullscreenPageState extends State<FullscreenPage> with SingleTickerProvide
pageController: _horizontalPager, pageController: _horizontalPager,
onTap: () => _overlayVisible.value = !_overlayVisible.value, onTap: () => _overlayVisible.value = !_overlayVisible.value,
onPageChanged: (page) => setState(() => _currentHorizontalPage = page), onPageChanged: (page) => setState(() => _currentHorizontalPage = page),
onScaleChanged: (state) => setState(() => _isInitialScale = state == PhotoViewScaleState.initial),
), ),
InfoPage( InfoPage(
entry: entries[_currentHorizontalPage], entry: entries[_currentHorizontalPage],
@ -141,12 +144,14 @@ class ImagePage extends StatefulWidget {
final PageController pageController; final PageController pageController;
final VoidCallback onTap; final VoidCallback onTap;
final ValueChanged<int> onPageChanged; final ValueChanged<int> onPageChanged;
final ValueChanged<PhotoViewScaleState> onScaleChanged;
const ImagePage({ const ImagePage({
this.entries, this.entries,
this.pageController, this.pageController,
this.onTap, this.onTap,
this.onPageChanged, this.onPageChanged,
this.onScaleChanged,
}); });
@override @override
@ -174,6 +179,7 @@ class ImagePageState extends State<ImagePage> with AutomaticKeepAliveClientMixin
), ),
pageController: widget.pageController, pageController: widget.pageController,
onPageChanged: widget.onPageChanged, onPageChanged: widget.onPageChanged,
scaleStateChangedCallback: widget.onScaleChanged,
transitionOnUserGestures: true, transitionOnUserGestures: true,
scrollPhysics: BouncingScrollPhysics(), scrollPhysics: BouncingScrollPhysics(),
); );