carousel_controller.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'dart:async';
  2. import 'package:eye_video/framework/uikit/carousel/carousel_option.dart';
  3. import 'package:eye_video/framework/uikit/carousel/carousel_state.dart';
  4. import 'package:eye_video/framework/uikit/carousel/utils.dart';
  5. import 'package:flutter/material.dart';
  6. abstract class AbsCarouselController {
  7. bool get ready;
  8. Future<Null> get onReady;
  9. void nextPage({Duration duration, Curve curve});
  10. void prevPage({Duration duration, Curve curve});
  11. void seekToPage(int page);
  12. void seekToPageAnim(int page, {Duration duration, Curve curve});
  13. factory AbsCarouselController() => CarouselController();
  14. }
  15. class CarouselController implements AbsCarouselController {
  16. final Completer<Null> _readyCompleter = Completer<Null>();
  17. CarouselState _state;
  18. set state(CarouselState state) {
  19. _state = state;
  20. if (!_readyCompleter.isCompleted) {
  21. _readyCompleter.complete();
  22. }
  23. }
  24. void _setModeController() =>
  25. _state.changeMode(CarouselPageChangedReason.controller);
  26. @override
  27. bool get ready => _state != null;
  28. @override
  29. Future<Null> get onReady => _readyCompleter.future;
  30. @override
  31. Future<void> nextPage(
  32. {Duration duration = const Duration(milliseconds: 300),
  33. Curve curve = Curves.linear}) async {
  34. final bool isNeedResetTimer = _state.options.pauseAutoPlayOnManualNavigate;
  35. if (isNeedResetTimer) {
  36. _state.onResetTimer();
  37. }
  38. await _state.pageController.nextPage(duration: duration, curve: curve);
  39. _setModeController();
  40. if (isNeedResetTimer) {
  41. _state.onResumeTimer();
  42. }
  43. }
  44. @override
  45. Future<void> prevPage(
  46. {Duration duration = const Duration(milliseconds: 300),
  47. Curve curve = Curves.linear}) async {
  48. final bool isNeedResetTimer = _state.options.pauseAutoPlayOnManualNavigate;
  49. if (isNeedResetTimer) {
  50. _state.onResetTimer();
  51. }
  52. _setModeController();
  53. await _state.pageController.previousPage(duration: duration, curve: curve);
  54. if (isNeedResetTimer) {
  55. _state.onResumeTimer();
  56. }
  57. }
  58. @override
  59. void seekToPage(int page) {
  60. final index = getRealIndex(_state.pageController.page.toInt(),
  61. _state.realIndex - _state.initIndex, _state.itemCount);
  62. _setModeController();
  63. final int pageToJump = _state.pageController.page.toInt() + page - index;
  64. return _state.pageController.jumpToPage(pageToJump);
  65. }
  66. @override
  67. Future<void> seekToPageAnim(int page,
  68. {Duration duration = const Duration(milliseconds: 300),
  69. Curve curve = Curves.linear}) async {
  70. final bool isNeedResetTimer = _state.options.pauseAutoPlayOnManualNavigate;
  71. if (isNeedResetTimer) {
  72. _state.onResetTimer();
  73. }
  74. final index = getRealIndex(_state.pageController.page.toInt(),
  75. _state.realIndex - _state.initIndex, _state.itemCount);
  76. _setModeController();
  77. await _state.pageController.animateToPage(
  78. _state.pageController.page.toInt() + page - index,
  79. duration: duration,
  80. curve: curve);
  81. if (isNeedResetTimer) {
  82. _state.onResumeTimer();
  83. }
  84. }
  85. }