Files
flutter_thingsboard_app/lib/widgets/two_page_view.dart
2021-11-15 19:34:40 +02:00

111 lines
2.5 KiB
Dart

import 'package:flutter/widgets.dart';
import 'package:preload_page_view/preload_page_view.dart';
class TwoPageViewController {
_TwoPageViewState? _state;
setTransitionIndexedStackState(_TwoPageViewState state) {
_state = state;
}
Future<bool> open(int index, {bool animate = true}) async {
if (_state != null) {
return _state!._open(index, animate: animate);
}
return false;
}
Future<bool> close(int index, {bool animate = true}) async {
if (_state != null) {
return _state!._close(index, animate: animate);
}
return false;
}
int? get index => _state?._selectedIndex;
}
class TwoPageView extends StatefulWidget {
final Widget first;
final Widget second;
final Duration duration;
final TwoPageViewController? controller;
const TwoPageView({
Key? key,
required this.first,
required this.second,
this.controller,
this.duration = const Duration(milliseconds: 250)
}) : super(key: key);
@override
_TwoPageViewState createState() => _TwoPageViewState();
}
class _TwoPageViewState extends State<TwoPageView> {
late List<Widget> _pages;
bool _reverse = false;
int _selectedIndex = 0;
final PreloadPageController _pageController = PreloadPageController();
@override
void initState() {
widget.controller?.setTransitionIndexedStackState(this);
_pages = [widget.first, widget.second];
super.initState();
}
Future<bool> _open(int index, {bool animate = true}) async {
if (_selectedIndex != index) {
_selectedIndex = index;
if (index == 0) {
setState(() {
_reverse = true;
});
}
await _pageController.animateToPage(_selectedIndex, duration: widget.duration, curve: Curves.fastOutSlowIn);
return true;
}
return false;
}
Future<bool> _close(int index, {bool animate = true}) async {
if (_selectedIndex == index) {
_selectedIndex = index == 1 ? 0 : 1;
await _pageController.animateToPage(_selectedIndex, duration: widget.duration, curve: Curves.fastOutSlowIn);
if (index == 0) {
setState(() {
_reverse = false;
});
}
return true;
}
return false;
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return new PreloadPageView(
children: _pages,
physics: NeverScrollableScrollPhysics(),
reverse: _reverse,
onPageChanged: (int position) {
_selectedIndex = position;
},
preloadPagesCount: 2,
controller: _pageController,
);
}
}