From b20368fdfec65f25897d9fc115cfa45fa6e16048 Mon Sep 17 00:00:00 2001 From: Thomas Fransolet Date: Thu, 1 Aug 2024 11:27:55 +0200 Subject: [PATCH] update to sdk 34 + fix build --- android/app/build.gradle | 4 +- .../Carousel/carousel_controller.dart | 149 +++++ lib/Components/Carousel/carousel_options.dart | 223 +++++++ lib/Components/Carousel/carousel_slider.dart | 396 ++++++++++++ lib/Components/Carousel/carousel_state.dart | 43 ++ lib/Components/Carousel/utils.dart | 23 + lib/Components/SliderImages.dart | 12 +- lib/Screens/Quizz/questions_list.dart | 14 +- lib/Screens/Quizz/quizz_page.dart | 6 +- lib/main.dart | 2 +- pubspec.lock | 584 +++++++++--------- pubspec.yaml | 4 +- 12 files changed, 1147 insertions(+), 313 deletions(-) create mode 100644 lib/Components/Carousel/carousel_controller.dart create mode 100644 lib/Components/Carousel/carousel_options.dart create mode 100644 lib/Components/Carousel/carousel_slider.dart create mode 100644 lib/Components/Carousel/carousel_state.dart create mode 100644 lib/Components/Carousel/utils.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index acbfb99..0b98e94 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -32,7 +32,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -50,7 +50,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "be.unov.mymuseum.fortsaintheribert" - minSdkVersion 20 + minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/lib/Components/Carousel/carousel_controller.dart b/lib/Components/Carousel/carousel_controller.dart new file mode 100644 index 0000000..8fa3c04 --- /dev/null +++ b/lib/Components/Carousel/carousel_controller.dart @@ -0,0 +1,149 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; + +import 'carousel_options.dart'; +import 'carousel_state.dart'; +import 'utils.dart'; + +abstract class CarouselController { + bool get ready; + + Future get onReady; + + Future nextPage({Duration? duration, Curve? curve}); + + Future previousPage({Duration? duration, Curve? curve}); + + void jumpToPage(int page); + + Future animateToPage(int page, {Duration? duration, Curve? curve}); + + void startAutoPlay(); + + void stopAutoPlay(); + + factory CarouselController() => CarouselControllerImpl(); +} + +class CarouselControllerImpl implements CarouselController { + final Completer _readyCompleter = Completer(); + + CarouselState? _state; + + set state(CarouselState? state) { + _state = state; + if (!_readyCompleter.isCompleted) { + _readyCompleter.complete(); + } + } + + void _setModeController() => + _state!.changeMode(CarouselPageChangedReason.controller); + + @override + bool get ready => _state != null; + + @override + Future get onReady => _readyCompleter.future; + + /// Animates the controlled [CarouselSlider] to the next page. + /// + /// The animation lasts for the given duration and follows the given curve. + /// The returned [Future] resolves when the animation completes. + Future nextPage( + {Duration? duration = const Duration(milliseconds: 300), + Curve? curve = Curves.linear}) async { + final bool isNeedResetTimer = _state!.options.pauseAutoPlayOnManualNavigate; + if (isNeedResetTimer) { + _state!.onResetTimer(); + } + _setModeController(); + await _state!.pageController!.nextPage(duration: duration!, curve: curve!); + if (isNeedResetTimer) { + _state!.onResumeTimer(); + } + } + + /// Animates the controlled [CarouselSlider] to the previous page. + /// + /// The animation lasts for the given duration and follows the given curve. + /// The returned [Future] resolves when the animation completes. + Future previousPage( + {Duration? duration = const Duration(milliseconds: 300), + Curve? curve = Curves.linear}) async { + final bool isNeedResetTimer = _state!.options.pauseAutoPlayOnManualNavigate; + if (isNeedResetTimer) { + _state!.onResetTimer(); + } + _setModeController(); + await _state!.pageController! + .previousPage(duration: duration!, curve: curve!); + if (isNeedResetTimer) { + _state!.onResumeTimer(); + } + } + + /// Changes which page is displayed in the controlled [CarouselSlider]. + /// + /// Jumps the page position from its current value to the given value, + /// without animation, and without checking if the new value is in range. + void jumpToPage(int page) { + final index = getRealIndex(_state!.pageController!.page!.toInt(), + _state!.realPage - _state!.initialPage, _state!.itemCount); + + _setModeController(); + final int pageToJump = _state!.pageController!.page!.toInt() + page - index; + return _state!.pageController!.jumpToPage(pageToJump); + } + + /// Animates the controlled [CarouselSlider] from the current page to the given page. + /// + /// The animation lasts for the given duration and follows the given curve. + /// The returned [Future] resolves when the animation completes. + Future animateToPage(int page, + {Duration? duration = const Duration(milliseconds: 300), + Curve? curve = Curves.linear}) async { + final bool isNeedResetTimer = _state!.options.pauseAutoPlayOnManualNavigate; + if (isNeedResetTimer) { + _state!.onResetTimer(); + } + final index = getRealIndex(_state!.pageController!.page!.toInt(), + _state!.realPage - _state!.initialPage, _state!.itemCount); + int smallestMovement = page - index; + if (_state!.options.enableInfiniteScroll && + _state!.itemCount != null && + _state!.options.animateToClosest) { + if ((page - index).abs() > (page + _state!.itemCount! - index).abs()) { + smallestMovement = page + _state!.itemCount! - index; + } else if ((page - index).abs() > + (page - _state!.itemCount! - index).abs()) { + smallestMovement = page - _state!.itemCount! - index; + } + } + _setModeController(); + await _state!.pageController!.animateToPage( + _state!.pageController!.page!.toInt() + smallestMovement, + duration: duration!, + curve: curve!); + if (isNeedResetTimer) { + _state!.onResumeTimer(); + } + } + + /// Starts the controlled [CarouselSlider] autoplay. + /// + /// The carousel will only autoPlay if the [autoPlay] parameter + /// in [CarouselOptions] is true. + void startAutoPlay() { + _state!.onResumeTimer(); + } + + /// Stops the controlled [CarouselSlider] from autoplaying. + /// + /// This is a more on-demand way of doing this. Use the [autoPlay] + /// parameter in [CarouselOptions] to specify the autoPlay behaviour of the carousel. + void stopAutoPlay() { + _state!.onResetTimer(); + } +} \ No newline at end of file diff --git a/lib/Components/Carousel/carousel_options.dart b/lib/Components/Carousel/carousel_options.dart new file mode 100644 index 0000000..77ae333 --- /dev/null +++ b/lib/Components/Carousel/carousel_options.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; + +enum CarouselPageChangedReason { timed, manual, controller } + +enum CenterPageEnlargeStrategy { scale, height, zoom } + +class CarouselOptions { + /// Set carousel height and overrides any existing [aspectRatio]. + final double? height; + + /// Aspect ratio is used if no height have been declared. + /// + /// Defaults to 16:9 aspect ratio. + final double aspectRatio; + + /// The fraction of the viewport that each page should occupy. + /// + /// Defaults to 0.8, which means each page fills 80% of the carousel. + final double viewportFraction; + + /// The initial page to show when first creating the [CarouselSlider]. + /// + /// Defaults to 0. + final int initialPage; + + ///Determines if carousel should loop infinitely or be limited to item length. + /// + ///Defaults to true, i.e. infinite loop. + final bool enableInfiniteScroll; + + ///Determines if carousel should loop to the closest occurence of requested page. + /// + ///Defaults to true. + final bool animateToClosest; + + /// Reverse the order of items if set to true. + /// + /// Defaults to false. + final bool reverse; + + /// Enables auto play, sliding one page at a time. + /// + /// Use [autoPlayInterval] to determent the frequency of slides. + /// Defaults to false. + final bool autoPlay; + + /// Sets Duration to determent the frequency of slides when + /// + /// [autoPlay] is set to true. + /// Defaults to 4 seconds. + final Duration autoPlayInterval; + + /// The animation duration between two transitioning pages while in auto playback. + /// + /// Defaults to 800 ms. + final Duration autoPlayAnimationDuration; + + /// Determines the animation curve physics. + /// + /// Defaults to [Curves.fastOutSlowIn]. + final Curve autoPlayCurve; + + /// Determines if current page should be larger than the side images, + /// creating a feeling of depth in the carousel. + /// + /// Defaults to false. + final bool? enlargeCenterPage; + + /// The axis along which the page view scrolls. + /// + /// Defaults to [Axis.horizontal]. + final Axis scrollDirection; + + /// Called whenever the page in the center of the viewport changes. + final Function(int index, CarouselPageChangedReason reason)? onPageChanged; + + /// Called whenever the carousel is scrolled + final ValueChanged? onScrolled; + + /// How the carousel should respond to user input. + /// + /// For example, determines how the items continues to animate after the + /// user stops dragging the page view. + /// + /// The physics are modified to snap to page boundaries using + /// [PageScrollPhysics] prior to being used. + /// + /// Defaults to matching platform conventions. + final ScrollPhysics? scrollPhysics; + + /// Set to false to disable page snapping, useful for custom scroll behavior. + /// + /// Default to `true`. + final bool pageSnapping; + + /// If `true`, the auto play function will be paused when user is interacting with + /// the carousel, and will be resumed when user finish interacting. + /// Default to `true`. + final bool pauseAutoPlayOnTouch; + + /// If `true`, the auto play function will be paused when user is calling + /// pageController's `nextPage` or `previousPage` or `animateToPage` method. + /// And after the animation complete, the auto play will be resumed. + /// Default to `true`. + final bool pauseAutoPlayOnManualNavigate; + + /// If `enableInfiniteScroll` is `false`, and `autoPlay` is `true`, this option + /// decide the carousel should go to the first item when it reach the last item or not. + /// If set to `true`, the auto play will be paused when it reach the last item. + /// If set to `false`, the auto play function will animate to the first item when it was + /// in the last item. + final bool pauseAutoPlayInFiniteScroll; + + /// Pass a `PageStoragekey` if you want to keep the pageview's position when it was recreated. + final PageStorageKey? pageViewKey; + + /// Use [enlargeStrategy] to determine which method to enlarge the center page. + final CenterPageEnlargeStrategy enlargeStrategy; + + /// How much the pages next to the center page will be scaled down. + /// If `enlargeCenterPage` is false, this property has no effect. + final double enlargeFactor; + + /// Whether or not to disable the `Center` widget for each slide. + final bool disableCenter; + + /// Whether to add padding to both ends of the list. + /// If this is set to true and [viewportFraction] < 1.0, padding will be added such that the first and last child slivers will be in the center of the viewport when scrolled all the way to the start or end, respectively. + /// If [viewportFraction] >= 1.0, this property has no effect. + /// This property defaults to true and must not be null. + final bool padEnds; + + /// Exposed clipBehavior of PageView + final Clip clipBehavior; + + CarouselOptions({ + this.height, + this.aspectRatio = 16 / 9, + this.viewportFraction = 0.8, + this.initialPage = 0, + this.enableInfiniteScroll = true, + this.animateToClosest = true, + this.reverse = false, + this.autoPlay = false, + this.autoPlayInterval = const Duration(seconds: 4), + this.autoPlayAnimationDuration = const Duration(milliseconds: 800), + this.autoPlayCurve = Curves.fastOutSlowIn, + this.enlargeCenterPage = false, + this.onPageChanged, + this.onScrolled, + this.scrollPhysics, + this.pageSnapping = true, + this.scrollDirection = Axis.horizontal, + this.pauseAutoPlayOnTouch = true, + this.pauseAutoPlayOnManualNavigate = true, + this.pauseAutoPlayInFiniteScroll = false, + this.pageViewKey, + this.enlargeStrategy = CenterPageEnlargeStrategy.scale, + this.enlargeFactor = 0.3, + this.disableCenter = false, + this.padEnds = true, + this.clipBehavior = Clip.hardEdge, + }); + + ///Generate new [CarouselOptions] based on old ones. + + CarouselOptions copyWith( + {double? height, + double? aspectRatio, + double? viewportFraction, + int? initialPage, + bool? enableInfiniteScroll, + bool? reverse, + bool? autoPlay, + Duration? autoPlayInterval, + Duration? autoPlayAnimationDuration, + Curve? autoPlayCurve, + bool? enlargeCenterPage, + Function(int index, CarouselPageChangedReason reason)? onPageChanged, + ValueChanged? onScrolled, + ScrollPhysics? scrollPhysics, + bool? pageSnapping, + Axis? scrollDirection, + bool? pauseAutoPlayOnTouch, + bool? pauseAutoPlayOnManualNavigate, + bool? pauseAutoPlayInFiniteScroll, + PageStorageKey? pageViewKey, + CenterPageEnlargeStrategy? enlargeStrategy, + double? enlargeFactor, + bool? disableCenter, + Clip? clipBehavior, + bool? padEnds}) => + CarouselOptions( + height: height ?? this.height, + aspectRatio: aspectRatio ?? this.aspectRatio, + viewportFraction: viewportFraction ?? this.viewportFraction, + initialPage: initialPage ?? this.initialPage, + enableInfiniteScroll: enableInfiniteScroll ?? this.enableInfiniteScroll, + reverse: reverse ?? this.reverse, + autoPlay: autoPlay ?? this.autoPlay, + autoPlayInterval: autoPlayInterval ?? this.autoPlayInterval, + autoPlayAnimationDuration: + autoPlayAnimationDuration ?? this.autoPlayAnimationDuration, + autoPlayCurve: autoPlayCurve ?? this.autoPlayCurve, + enlargeCenterPage: enlargeCenterPage ?? this.enlargeCenterPage, + onPageChanged: onPageChanged ?? this.onPageChanged, + onScrolled: onScrolled ?? this.onScrolled, + scrollPhysics: scrollPhysics ?? this.scrollPhysics, + pageSnapping: pageSnapping ?? this.pageSnapping, + scrollDirection: scrollDirection ?? this.scrollDirection, + pauseAutoPlayOnTouch: pauseAutoPlayOnTouch ?? this.pauseAutoPlayOnTouch, + pauseAutoPlayOnManualNavigate: + pauseAutoPlayOnManualNavigate ?? this.pauseAutoPlayOnManualNavigate, + pauseAutoPlayInFiniteScroll: + pauseAutoPlayInFiniteScroll ?? this.pauseAutoPlayInFiniteScroll, + pageViewKey: pageViewKey ?? this.pageViewKey, + enlargeStrategy: enlargeStrategy ?? this.enlargeStrategy, + enlargeFactor: enlargeFactor ?? this.enlargeFactor, + disableCenter: disableCenter ?? this.disableCenter, + clipBehavior: clipBehavior ?? this.clipBehavior, + padEnds: padEnds ?? this.padEnds, + ); +} \ No newline at end of file diff --git a/lib/Components/Carousel/carousel_slider.dart b/lib/Components/Carousel/carousel_slider.dart new file mode 100644 index 0000000..6a5f8b4 --- /dev/null +++ b/lib/Components/Carousel/carousel_slider.dart @@ -0,0 +1,396 @@ +import 'dart:async'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; + +import 'carousel_controller.dart' as cs; +import 'carousel_options.dart'; +import 'carousel_state.dart'; +import 'utils.dart'; + +export 'carousel_controller.dart'; +export 'carousel_options.dart'; + +typedef Widget ExtendedIndexedWidgetBuilder( + BuildContext context, int index, int realIndex); + +class CarouselSlider extends StatefulWidget { + /// [CarouselOptions] to create a [CarouselState] with + final CarouselOptions options; + + final bool? disableGesture; + + /// The widgets to be shown in the carousel of default constructor + final List? items; + + /// The widget item builder that will be used to build item on demand + /// The third argument is the PageView's real index, can be used to cooperate + /// with Hero. + final ExtendedIndexedWidgetBuilder? itemBuilder; + + /// A [MapController], used to control the map. + final cs.CarouselControllerImpl _carouselController; + + final int? itemCount; + + CarouselSlider( + {required this.items, + required this.options, + this.disableGesture, + cs.CarouselController? carouselController, + Key? key}) + : itemBuilder = null, + itemCount = items != null ? items.length : 0, + _carouselController = carouselController != null + ? carouselController as cs.CarouselControllerImpl + : cs.CarouselController() as cs.CarouselControllerImpl, + super(key: key); + + /// The on demand item builder constructor + CarouselSlider.builder( + {required this.itemCount, + required this.itemBuilder, + required this.options, + this.disableGesture, + cs.CarouselController? carouselController, + Key? key}) + : items = null, + _carouselController = carouselController != null + ? carouselController as cs.CarouselControllerImpl + : cs.CarouselController() as cs.CarouselControllerImpl, + super(key: key); + + @override + CarouselSliderState createState() => CarouselSliderState(_carouselController); +} + +class CarouselSliderState extends State + with TickerProviderStateMixin { + final cs.CarouselControllerImpl carouselController; + Timer? timer; + + CarouselOptions get options => widget.options; + + CarouselState? carouselState; + + PageController? pageController; + + /// mode is related to why the page is being changed + CarouselPageChangedReason mode = CarouselPageChangedReason.controller; + + CarouselSliderState(this.carouselController); + + void changeMode(CarouselPageChangedReason _mode) { + mode = _mode; + } + + @override + void didUpdateWidget(CarouselSlider oldWidget) { + carouselState!.options = options; + carouselState!.itemCount = widget.itemCount; + + // pageController needs to be re-initialized to respond to state changes + pageController = PageController( + viewportFraction: options.viewportFraction, + initialPage: carouselState!.realPage, + ); + carouselState!.pageController = pageController; + + // handle autoplay when state changes + handleAutoPlay(); + + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + super.initState(); + carouselState = + CarouselState(this.options, clearTimer, resumeTimer, this.changeMode); + + carouselState!.itemCount = widget.itemCount; + carouselController.state = carouselState; + carouselState!.initialPage = widget.options.initialPage; + carouselState!.realPage = options.enableInfiniteScroll + ? carouselState!.realPage + carouselState!.initialPage + : carouselState!.initialPage; + handleAutoPlay(); + + pageController = PageController( + viewportFraction: options.viewportFraction, + initialPage: carouselState!.realPage, + ); + + carouselState!.pageController = pageController; + } + + Timer? getTimer() { + return widget.options.autoPlay + ? Timer.periodic(widget.options.autoPlayInterval, (_) { + if (!mounted) { + clearTimer(); + return; + } + + final route = ModalRoute.of(context); + if (route?.isCurrent == false) { + return; + } + + CarouselPageChangedReason previousReason = mode; + changeMode(CarouselPageChangedReason.timed); + int nextPage = carouselState!.pageController!.page!.round() + 1; + int itemCount = widget.itemCount ?? widget.items!.length; + + if (nextPage >= itemCount && + widget.options.enableInfiniteScroll == false) { + if (widget.options.pauseAutoPlayInFiniteScroll) { + clearTimer(); + return; + } + nextPage = 0; + } + + carouselState!.pageController! + .animateToPage(nextPage, + duration: widget.options.autoPlayAnimationDuration, + curve: widget.options.autoPlayCurve) + .then((_) => changeMode(previousReason)); + }) + : null; + } + + void clearTimer() { + if (timer != null) { + timer?.cancel(); + timer = null; + } + } + + void resumeTimer() { + if (timer == null) { + timer = getTimer(); + } + } + + void handleAutoPlay() { + bool autoPlayEnabled = widget.options.autoPlay; + + if (autoPlayEnabled && timer != null) return; + + clearTimer(); + if (autoPlayEnabled) { + resumeTimer(); + } + } + + Widget getGestureWrapper(Widget child) { + Widget wrapper; + if (widget.options.height != null) { + wrapper = Container(height: widget.options.height, child: child); + } else { + wrapper = + AspectRatio(aspectRatio: widget.options.aspectRatio, child: child); + } + + if (true == widget.disableGesture) { + return NotificationListener( + onNotification: (Notification notification) { + if (widget.options.onScrolled != null && + notification is ScrollUpdateNotification) { + widget.options.onScrolled!(carouselState!.pageController!.page); + } + return false; + }, + child: wrapper, + ); + } + + return RawGestureDetector( + behavior: HitTestBehavior.opaque, + gestures: { + _MultipleGestureRecognizer: + GestureRecognizerFactoryWithHandlers<_MultipleGestureRecognizer>( + () => _MultipleGestureRecognizer(), + (_MultipleGestureRecognizer instance) { + instance.onStart = (_) { + onStart(); + }; + instance.onDown = (_) { + onPanDown(); + }; + instance.onEnd = (_) { + onPanUp(); + }; + instance.onCancel = () { + onPanUp(); + }; + }), + }, + child: NotificationListener( + onNotification: (Notification notification) { + if (widget.options.onScrolled != null && + notification is ScrollUpdateNotification) { + widget.options.onScrolled!(carouselState!.pageController!.page); + } + return false; + }, + child: wrapper, + ), + ); + } + + Widget getCenterWrapper(Widget child) { + if (widget.options.disableCenter) { + return Container( + child: child, + ); + } + return Center(child: child); + } + + Widget getEnlargeWrapper(Widget? child, + {double? width, + double? height, + double? scale, + required double itemOffset}) { + if (widget.options.enlargeStrategy == CenterPageEnlargeStrategy.height) { + return SizedBox(child: child, width: width, height: height); + } + if (widget.options.enlargeStrategy == CenterPageEnlargeStrategy.zoom) { + late Alignment alignment; + final bool horizontal = options.scrollDirection == Axis.horizontal; + if (itemOffset > 0) { + alignment = horizontal ? Alignment.centerRight : Alignment.bottomCenter; + } else { + alignment = horizontal ? Alignment.centerLeft : Alignment.topCenter; + } + return Transform.scale(child: child, scale: scale!, alignment: alignment); + } + return Transform.scale( + scale: scale!, + child: Container(child: child, width: width, height: height)); + } + + void onStart() { + changeMode(CarouselPageChangedReason.manual); + } + + void onPanDown() { + if (widget.options.pauseAutoPlayOnTouch) { + clearTimer(); + } + + changeMode(CarouselPageChangedReason.manual); + } + + void onPanUp() { + if (widget.options.pauseAutoPlayOnTouch) { + resumeTimer(); + } + } + + @override + void dispose() { + super.dispose(); + clearTimer(); + } + + @override + Widget build(BuildContext context) { + return getGestureWrapper(PageView.builder( + padEnds: widget.options.padEnds, + scrollBehavior: ScrollConfiguration.of(context).copyWith( + scrollbars: false, + overscroll: false, + dragDevices: { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }, + ), + clipBehavior: widget.options.clipBehavior, + physics: widget.options.scrollPhysics, + scrollDirection: widget.options.scrollDirection, + pageSnapping: widget.options.pageSnapping, + controller: carouselState!.pageController, + reverse: widget.options.reverse, + itemCount: widget.options.enableInfiniteScroll ? null : widget.itemCount, + key: widget.options.pageViewKey, + onPageChanged: (int index) { + int currentPage = getRealIndex(index + carouselState!.initialPage, + carouselState!.realPage, widget.itemCount); + if (widget.options.onPageChanged != null) { + widget.options.onPageChanged!(currentPage, mode); + } + }, + itemBuilder: (BuildContext context, int idx) { + final int index = getRealIndex(idx + carouselState!.initialPage, + carouselState!.realPage, widget.itemCount); + + return AnimatedBuilder( + animation: carouselState!.pageController!, + child: (widget.items != null) + ? (widget.items!.length > 0 ? widget.items![index] : Container()) + : widget.itemBuilder!(context, index, idx), + builder: (BuildContext context, child) { + double distortionValue = 1.0; + // if `enlargeCenterPage` is true, we must calculate the carousel item's height + // to display the visual effect + double itemOffset = 0; + if (widget.options.enlargeCenterPage != null && + widget.options.enlargeCenterPage == true) { + // pageController.page can only be accessed after the first build, + // so in the first build we calculate the itemoffset manually + var position = carouselState?.pageController?.position; + if (position != null && + position.hasPixels && + position.hasContentDimensions) { + var _page = carouselState?.pageController?.page; + if (_page != null) { + itemOffset = _page - idx; + } + } else { + BuildContext storageContext = carouselState! + .pageController!.position.context.storageContext; + final double? previousSavedPosition = + PageStorage.of(storageContext)?.readState(storageContext) + as double?; + if (previousSavedPosition != null) { + itemOffset = previousSavedPosition - idx.toDouble(); + } else { + itemOffset = + carouselState!.realPage.toDouble() - idx.toDouble(); + } + } + + final double enlargeFactor = + options.enlargeFactor.clamp(0.0, 1.0); + final num distortionRatio = + (1 - (itemOffset.abs() * enlargeFactor)).clamp(0.0, 1.0); + distortionValue = + Curves.easeOut.transform(distortionRatio as double); + } + + final double height = widget.options.height ?? + MediaQuery.of(context).size.width * + (1 / widget.options.aspectRatio); + + if (widget.options.scrollDirection == Axis.horizontal) { + return getCenterWrapper(getEnlargeWrapper(child, + height: distortionValue * height, + scale: distortionValue, + itemOffset: itemOffset)); + } else { + return getCenterWrapper(getEnlargeWrapper(child, + width: distortionValue * MediaQuery.of(context).size.width, + scale: distortionValue, + itemOffset: itemOffset)); + } + }, + ); + }, + )); + } +} + +class _MultipleGestureRecognizer extends PanGestureRecognizer {} diff --git a/lib/Components/Carousel/carousel_state.dart b/lib/Components/Carousel/carousel_state.dart new file mode 100644 index 0000000..63ac533 --- /dev/null +++ b/lib/Components/Carousel/carousel_state.dart @@ -0,0 +1,43 @@ + +import 'package:flutter/material.dart'; + +import 'carousel_options.dart'; + +class CarouselState { + /// The [CarouselOptions] to create this state + CarouselOptions options; + + /// [pageController] is created using the properties passed to the constructor + /// and can be used to control the [PageView] it is passed to. + PageController? pageController; + + /// The actual index of the [PageView]. + /// + /// This value can be ignored unless you know the carousel will be scrolled + /// backwards more then 10000 pages. + /// Defaults to 10000 to simulate infinite backwards scrolling. + int realPage = 10000; + + /// The initial index of the [PageView] on [CarouselSlider] init. + /// + int initialPage = 0; + + /// The widgets count that should be shown at carousel + int? itemCount; + + /// Will be called when using pageController to go to next page or + /// previous page. It will clear the autoPlay timer. + /// Internal use only + Function onResetTimer; + + /// Will be called when using pageController to go to next page or + /// previous page. It will restart the autoPlay timer. + /// Internal use only + Function onResumeTimer; + + /// The callback to set the Reason Carousel changed + Function(CarouselPageChangedReason) changeMode; + + CarouselState( + this.options, this.onResetTimer, this.onResumeTimer, this.changeMode); +} \ No newline at end of file diff --git a/lib/Components/Carousel/utils.dart b/lib/Components/Carousel/utils.dart new file mode 100644 index 0000000..4f9ede3 --- /dev/null +++ b/lib/Components/Carousel/utils.dart @@ -0,0 +1,23 @@ +/// Converts an index of a set size to the corresponding index of a collection of another size +/// as if they were circular. +/// +/// Takes a [position] from collection Foo, a [base] from where Foo's index originated +/// and the [length] of a second collection Baa, for which the correlating index is sought. +/// +/// For example; We have a Carousel of 10000(simulating infinity) but only 6 images. +/// We need to repeat the images to give the illusion of a never ending stream. +/// By calling _getRealIndex with position and base we get an offset. +/// This offset modulo our length, 6, will return a number between 0 and 5, which represent the image +/// to be placed in the given position. +int getRealIndex(int position, int base, int? length) { + final int offset = position - base; + return remainder(offset, length); +} + +/// Returns the remainder of the modulo operation [input] % [source], and adjust it for +/// negative values. +int remainder(int input, int? source) { + if (source == 0) return 0; + final int result = input % source!; + return result < 0 ? source + result : result; +} \ No newline at end of file diff --git a/lib/Components/SliderImages.dart b/lib/Components/SliderImages.dart index f820ca1..d30e63f 100644 --- a/lib/Components/SliderImages.dart +++ b/lib/Components/SliderImages.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'package:carousel_slider/carousel_slider.dart'; import 'package:flutter/material.dart'; import 'package:manager_api/api.dart'; import 'package:mymuseum_visitapp/Components/ShowImagePopup.dart'; @@ -8,6 +7,7 @@ import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/constants.dart'; import 'package:provider/provider.dart'; +import 'package:mymuseum_visitapp/Components/Carousel/carousel_slider.dart' as cs; class SliderImagesWidget extends StatefulWidget { final List resources; @@ -21,12 +21,12 @@ class SliderImagesWidget extends StatefulWidget { class _SliderImagesWidget extends State { List resourcesInWidget = []; - late CarouselController? sliderController; + late cs.CarouselController? sliderController; final ValueNotifier currentIndex = ValueNotifier(1); @override void initState() { - sliderController = CarouselController(); + sliderController = cs.CarouselController(); resourcesInWidget = widget.resources; super.initState(); } @@ -52,10 +52,10 @@ class _SliderImagesWidget extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ if(resourcesInWidget.isNotEmpty) - CarouselSlider( + cs.CarouselSlider( carouselController: sliderController, - options: CarouselOptions( - onPageChanged: (int index, CarouselPageChangedReason reason) { + options: cs.CarouselOptions( + onPageChanged: (int index, cs.CarouselPageChangedReason reason) { //setState(() { //print("SET STATE"); currentIndex.value = index + 1; diff --git a/lib/Screens/Quizz/questions_list.dart b/lib/Screens/Quizz/questions_list.dart index 6b0fca2..c315a24 100644 --- a/lib/Screens/Quizz/questions_list.dart +++ b/lib/Screens/Quizz/questions_list.dart @@ -1,7 +1,8 @@ -import 'package:carousel_slider/carousel_slider.dart'; + import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:mymuseum_visitapp/Components/Carousel/carousel_slider.dart' as cs; import 'package:mymuseum_visitapp/Helpers/translationHelper.dart'; import 'package:mymuseum_visitapp/Models/ResponseSubDTO.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; @@ -9,7 +10,6 @@ import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/constants.dart'; import 'package:provider/provider.dart'; - class QuestionsListWidget extends StatefulWidget { List? questionsSubDTO; bool isShowResponse = false; @@ -23,7 +23,7 @@ class QuestionsListWidget extends StatefulWidget { class _QuestionsListWidget extends State { List _questionsSubDTO = []; - CarouselController? sliderController; + cs.CarouselController? sliderController; int currentIndex = 1; bool kIsWeb = false; @@ -31,7 +31,7 @@ class _QuestionsListWidget extends State { @override void initState() { super.initState(); - sliderController = CarouselController(); + sliderController = cs.CarouselController(); _questionsSubDTO = widget.questionsSubDTO!; } @@ -69,10 +69,10 @@ class _QuestionsListWidget extends State { mainAxisAlignment: MainAxisAlignment.start, children: [ if(_questionsSubDTO.isNotEmpty) - CarouselSlider( + cs.CarouselSlider( carouselController: sliderController, - options: CarouselOptions( - onPageChanged: (int index, CarouselPageChangedReason reason) { + options: cs.CarouselOptions( + onPageChanged: (int index, cs.CarouselPageChangedReason reason) { setState(() { currentIndex = index + 1; }); diff --git a/lib/Screens/Quizz/quizz_page.dart b/lib/Screens/Quizz/quizz_page.dart index 82af330..3d9d24e 100644 --- a/lib/Screens/Quizz/quizz_page.dart +++ b/lib/Screens/Quizz/quizz_page.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'dart:developer'; import 'dart:typed_data'; -import 'package:carousel_slider/carousel_slider.dart'; +import 'package:mymuseum_visitapp/Components/Carousel/carousel_slider.dart' as cs; //import 'package:confetti/confetti.dart'; import 'package:flutter/material.dart'; import 'package:manager_api/api.dart'; @@ -44,7 +44,7 @@ class _QuizzPageState extends State { QuizzDTO? quizzDTO; List _questionsSubDTO = []; //ConfettiController? _controllerCenter; - CarouselController? sliderController; + cs.CarouselController? sliderController; int currentIndex = 1; bool showResult = false; bool showResponses = false; @@ -59,7 +59,7 @@ class _QuizzPageState extends State { //_controllerCenter = ConfettiController(duration: const Duration(seconds: 10)); //_controllerCenter!.play(); - sliderController = CarouselController(); + sliderController = cs.CarouselController(); super.initState(); } diff --git a/lib/main.dart b/lib/main.dart index ebb1ed0..862a678 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -102,7 +102,7 @@ class _MyAppState extends State { primarySwatch: Colors.blue, scaffoldBackgroundColor: kBackgroundColor, //fontFamily: "Vollkorn", - textTheme: const TextTheme(bodyText1: TextStyle(color: kTestSecondColor)), + textTheme: const TextTheme(bodyLarge: TextStyle(color: kTestSecondColor)), visualDensity: VisualDensity.adaptivePlatformDensity, ), routes: { diff --git a/pubspec.lock b/pubspec.lock index d0ee74d..bce6490 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,34 +5,34 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "37bb1e815e15fbeefe916e4c941ef070f2f64d15a7eacc3cc0f6e8847b62319c" + sha256: "58826e40314219b223f4723dd4205845040161cdc2df3e6a1cdceed5d8165084" url: "https://pub.dev" source: hosted - version: "48.0.0" + version: "63.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: c50aea66893c20d44c365d4269983a74a5c1a4055b7b78f38fbf0e24f519b6a2 + sha256: f85566ec7b3d25cbea60f7dd4f157c5025f2f19233ca4feeed33b616c78a26a3 url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "6.1.0" archive: dependency: transitive description: name: archive - sha256: d6347d54a2d8028e0437e3c099f66fdb8ae02c4720c1e7534c9f24c10351f85d + sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d url: "https://pub.dev" source: hosted - version: "3.3.6" + version: "3.6.1" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.5.0" async: dependency: transitive description: @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: audio_session - sha256: "8a2bc5e30520e18f3fb0e366793d78057fb64cd5287862c76af0c8771f2a52ad" + sha256: "343e83bc7809fbda2591a49e525d6b63213ade10c76f15813be9aed6657b3261" url: "https://pub.dev" source: hosted - version: "0.1.16" + version: "0.1.21" auto_size_text: dependency: "direct main" description: @@ -69,10 +69,10 @@ packages: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.1" build_config: dependency: transitive description: @@ -85,34 +85,34 @@ packages: dependency: transitive description: name: build_daemon - sha256: "6bc5544ea6ce4428266e7ea680e945c68806c4aae2da0eb5e9ccf38df8d6acbf" + sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "4.0.2" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "687cf90a3951affac1bd5f9ecb5e3e90b60487f3d9cdc359bb310f8876bb02a6" + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" url: "https://pub.dev" source: hosted - version: "2.0.10" + version: "2.4.2" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 + sha256: dd09dd4e2b078992f42aac7f1a622f01882a8492fef08486b27ddde929c19f04 url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.12" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" + sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 url: "https://pub.dev" source: hosted - version: "7.2.7" + version: "7.3.2" built_collection: dependency: transitive description: @@ -125,42 +125,34 @@ packages: dependency: transitive description: name: built_value - sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725" + sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb url: "https://pub.dev" source: hosted - version: "8.4.3" + version: "8.9.2" cached_network_image: dependency: transitive description: name: cached_network_image - sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.3.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "4.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + sha256: "205d6a9f1862de34b93184f22b9d2d94586b2f05c581d546695e3d8f6a805cd7" url: "https://pub.dev" source: hosted - version: "1.0.2" - carousel_slider: - dependency: "direct main" - description: - name: carousel_slider - sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" - url: "https://pub.dev" - source: hosted - version: "4.2.1" + version: "1.2.0" characters: dependency: transitive description: @@ -173,18 +165,18 @@ packages: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" chewie: dependency: transitive description: name: chewie - sha256: "745e81e84c6d7f3835f89f85bb49771c0a66099e4caf8f8e9e9a372bc66fb2c1" + sha256: d4983f05f28f63ed05c1a741ac7327f6d72dff73f27484953478179fe70e762b url: "https://pub.dev" source: hosted - version: "1.5.0" + version: "1.8.2" cli_util: dependency: transitive description: @@ -205,18 +197,18 @@ packages: dependency: transitive description: name: code_builder - sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 url: "https://pub.dev" source: hosted - version: "4.4.0" + version: "4.10.0" collection: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" convert: dependency: transitive description: @@ -229,42 +221,50 @@ packages: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" csslib: dependency: transitive description: name: csslib - sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" url: "https://pub.dev" source: hosted - version: "0.17.3" + version: "1.0.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.8" dart_style: dependency: transitive description: name: dart_style - sha256: "7a03456c3490394c8e7665890333e91ae8a49be43542b616e414449ac358acd4" + sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.3.2" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" diacritic: dependency: "direct main" description: name: diacritic - sha256: c09a420e737dc036122121fea9f774767e95068f34a17894ee9db30c5bda3075 + sha256: "96db5db6149cbe4aa3cfcbfd170aca9b7648639be7e48025f9d458517f807fe4" url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.1.5" fake_async: dependency: transitive description: @@ -277,18 +277,18 @@ packages: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "2.1.2" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" fixnum: dependency: transitive description: @@ -310,22 +310,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.5.1" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" - url: "https://pub.dev" - source: hosted - version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager - sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" flutter_launcher_icons: dependency: "direct main" description: @@ -351,10 +343,10 @@ packages: dependency: transitive description: name: flutter_svg - sha256: f991fdb1533c3caeee0cdc14b04f50f0c3916f0dbcbc05237ccbe4e3c6b93f3f + sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter @@ -369,106 +361,98 @@ packages: dependency: "direct main" description: name: flutter_widget_from_html - sha256: "9a51be2a49bee770d5f26a9d1d9352f5156791dba83567fed096745de859a57b" + sha256: "8d2a9a7979a9c1a5d866d1f4134d2ec2cca78716c112c76803d6a552281405cc" url: "https://pub.dev" source: hosted - version: "0.10.1" + version: "0.10.6" flutter_widget_from_html_core: dependency: transitive description: name: flutter_widget_from_html_core - sha256: "77f05cd7a738078dcdbe07741140d58b2fe7509197f3855a91269fb5a90f4bee" + sha256: "22140caa191cb4bba0fe4d5e4ad875c7e8a9ba47d61517f56d733019cf76396d" url: "https://pub.dev" source: hosted - version: "0.10.1" + version: "0.10.6" frontend_server_client: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" fwfh_cached_network_image: dependency: transitive description: name: fwfh_cached_network_image - sha256: "396ebb3a01978aa75cad416656abef6ffa31e12de71cf2ccf5ff4173bd35a3eb" + sha256: "3de22aa3a6943c968e0d9fbcba4463b3dbbf7103171d62c84b6c672fb83eebdf" url: "https://pub.dev" source: hosted - version: "0.7.0+5" + version: "0.7.0+7" fwfh_chewie: dependency: transitive description: name: fwfh_chewie - sha256: "6474630c084cc90fbd348cea007d3cb41d62478460f75364e591f2baf26abccd" + sha256: "0b51a1c976bb74da5e8e45d545c74cb54a7168ad3938dd77103a7aee485f55fa" url: "https://pub.dev" source: hosted - version: "0.7.1+2" + version: "0.7.1+4" fwfh_just_audio: dependency: transitive description: name: fwfh_just_audio - sha256: "7b97696c264f36f7921c2f94e95c1d4186021699d85ca19aaa280f6b9700fb35" + sha256: "237b93a4cb9f0495a4b51940f361adda2a5abd57231dd44f07459db00144a6cd" url: "https://pub.dev" source: hosted - version: "0.9.0+2" + version: "0.9.0+3" fwfh_svg: dependency: transitive description: name: fwfh_svg - sha256: "398e8eec980e7b2868481489fd423634f7e337bc04c37508db6f84868b982120" + sha256: c6bb6b513f7ce2766aba76d7276caf9a96b6fee729ac3a492c366a42f82ef02e url: "https://pub.dev" source: hosted - version: "0.8.0+2" - fwfh_text_style: - dependency: transitive - description: - name: fwfh_text_style - sha256: f0883ccb64b7bb3f2a7a091542c2e834fc3e2a6aa54158f46b3c43b55675d8f7 - url: "https://pub.dev" - source: hosted - version: "2.22.8+3" + version: "0.8.2" fwfh_url_launcher: dependency: transitive description: name: fwfh_url_launcher - sha256: ff7f7a877c20fdbea24b453a0cd846a03ef1ea6b933943a7d37082388c27e849 + sha256: b9f5d55a5ae2c2c07243ba33f7ba49ac9544bdb2f4c16d8139df9ccbebe3449c url: "https://pub.dev" source: hosted - version: "0.9.0+2" + version: "0.9.1" fwfh_webview: dependency: transitive description: name: fwfh_webview - sha256: "7ebd3dff551d7281dd3fbb9f5523a8455592665ff75459ca84871ebbebe864a8" + sha256: "90a8dda0695403cf57abd7e8b83f6fb1f1a12933930a0bf9cac7cafb06e06a18" url: "https://pub.dev" source: hosted - version: "0.7.0+2" + version: "0.9.0+2" get: dependency: "direct main" description: name: get - sha256: "2ba20a47c8f1f233bed775ba2dd0d3ac97b4cf32fc17731b3dfc672b06b0e92a" + sha256: e4e7335ede17452b391ed3b2ede016545706c01a02292a6c97619705e7d2a85e url: "https://pub.dev" source: hosted - version: "4.6.5" + version: "4.6.6" glob: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" graphs: dependency: transitive description: name: graphs - sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" html: dependency: transitive description: @@ -481,10 +465,10 @@ packages: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" url: "https://pub.dev" source: hosted - version: "0.13.5" + version: "0.13.6" http_multi_server: dependency: transitive description: @@ -513,10 +497,10 @@ packages: dependency: "direct main" description: name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf url: "https://pub.dev" source: hosted - version: "0.18.1" + version: "0.19.0" io: dependency: transitive description: @@ -537,34 +521,58 @@ packages: dependency: transitive description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.0" + version: "4.9.0" just_audio: dependency: "direct main" description: name: just_audio - sha256: "890cd0fc41a1a4530c171e375a2a3fb6a09d84e9d508c5195f40bcff54330327" + sha256: ee50602364ba83fa6308f5512dd560c713ec3e1f2bc75f0db43618f0d82ef71a url: "https://pub.dev" source: hosted - version: "0.9.34" + version: "0.9.39" just_audio_platform_interface: dependency: transitive description: name: just_audio_platform_interface - sha256: d8409da198bbc59426cd45d4c92fca522a2ec269b576ce29459d6d6fcaeb44df + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" url: "https://pub.dev" source: hosted - version: "4.2.1" + version: "4.3.0" just_audio_web: dependency: transitive description: name: just_audio_web - sha256: ff62f733f437b25a0ff590f0e295fa5441dcb465f1edbdb33b3dea264705bc13 + sha256: "0edb481ad4aa1ff38f8c40f1a3576013c3420bf6669b686fe661627d49bc606c" url: "https://pub.dev" source: hosted - version: "0.4.8" + version: "0.4.11" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -577,10 +585,10 @@ packages: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" manager_api: dependency: "direct main" description: @@ -592,34 +600,34 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.15.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" nested: dependency: transitive description: @@ -632,34 +640,34 @@ packages: dependency: transitive description: name: octo_image - sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.0.0" openapi_generator: dependency: "direct main" description: name: openapi_generator - sha256: "2c9cf35d91a26330f09ec4a2370f07c5e3040921bd3f33751ba36ac4d2346dc0" + sha256: "77d150d227677d9099f26b20dd2cf70f84265de952e9eec345bd201540964aaf" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.13.1" openapi_generator_annotations: dependency: "direct main" description: name: openapi_generator_annotations - sha256: "1745b86b57943c5a09647c37dd909da61060ad65a0d3d3e48bef58f9c1eebb32" + sha256: "46f1fb675029d78e19ce9143e70ce414d738b0f6c45c49c004b4b3afdb405a5c" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.13.1" openapi_generator_cli: dependency: "direct main" description: name: openapi_generator_cli - sha256: "5d558ea599202dc487f829193b0ba0f28a0e7ad559e819a611b2146ef20c77f5" + sha256: e16968c99f7fbc02cfc06494a2eb93b68f95073b1b53010dc0709f8759657654 url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.13.1" package_config: dependency: transitive description: @@ -668,14 +676,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "4de6c36df77ffbcef0a5aefe04669d33f2d18397fea228277b852a2d4e58e860" + url: "https://pub.dev" + source: hosted + version: "8.0.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + url: "https://pub.dev" + source: hosted + version: "3.0.1" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -688,58 +712,50 @@ packages: dependency: transitive description: name: path_provider - sha256: dcea5feb97d8abf90cab9e9030b497fb7c3cbf26b7a1fe9e3ef7dcb0a1ddec95 + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.0.12" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + sha256: "490539678396d4c3c0b06efdaab75ae60675c3e0c66f72bc04c2e2c1e0e2abeb" url: "https://pub.dev" source: hosted - version: "2.0.22" + version: "2.2.9" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "62a68e7e1c6c459f9289859e2fae58290c981ce21d1697faf54910fe1faa4c74" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.4.0" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2e32f1640f07caef0d3cb993680f181c79e54a3827b997d5ee221490d131fbd9" + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 url: "https://pub.dev" source: hosted - version: "2.1.8" + version: "2.2.1" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.1.3" - pedantic: - dependency: transitive - description: - name: pedantic - sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" - url: "https://pub.dev" - source: hosted - version: "1.11.1" + version: "2.3.0" permission_handler: dependency: "direct main" description: @@ -752,18 +768,18 @@ packages: dependency: transitive description: name: permission_handler_platform_interface - sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.12.0" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "6.0.2" photo_view: dependency: "direct main" description: @@ -776,26 +792,18 @@ packages: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.3" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 - url: "https://pub.dev" - source: hosted - version: "3.6.2" + version: "2.1.8" pool: dependency: transitive description: @@ -804,38 +812,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.1" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" provider: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.2" pub_semver: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a" + sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" qr_code_scanner: dependency: "direct main" description: @@ -856,18 +856,18 @@ packages: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 + sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "2.0.0" sky_engine: dependency: transitive description: flutter @@ -877,10 +877,10 @@ packages: dependency: transitive description: name: source_gen - sha256: "2d79738b6bbf38a43920e2b8d189e9a3ce6cc201f4b8fc76be5e4fe377b1c38d" + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" url: "https://pub.dev" source: hosted - version: "1.2.6" + version: "1.5.0" source_span: dependency: transitive description: @@ -889,38 +889,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" sqflite: dependency: "direct main" description: name: sqflite - sha256: "851d5040552cf911f4cabda08d003eca76b27da3ed0002978272e27c8fbf8ecc" + sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d url: "https://pub.dev" source: hosted - version: "2.2.5" + version: "2.3.3+1" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bfd6973aaeeb93475bc0d875ac9aefddf7965ef22ce09790eb963992ffc5183f + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.4.2+2" + version: "2.5.4" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -933,18 +941,18 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" synchronized: dependency: transitive description: name: synchronized - sha256: "33b31b6beb98100bf9add464a36a8dd03eb10c7a8cf15aeec535e9b054aaf04b" + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.1.0+1" term_glyph: dependency: transitive description: @@ -957,10 +965,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.7.3" timing: dependency: transitive description: @@ -973,106 +981,106 @@ packages: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" url_launcher: dependency: transitive description: name: url_launcher - sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3 + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.1.11" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: eed4e6a1164aa9794409325c3b707ff424d4d1c2a785e7db67f8bbda00e36e51 + sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9" url: "https://pub.dev" source: hosted - version: "6.0.35" + version: "6.3.8" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5" + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.1.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "6bb1e5d7fe53daf02a8fee85352432a40b1f868a81880e99ec7440113d5cfcab" + sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a" url: "https://pub.dev" source: hosted - version: "2.0.17" + version: "2.3.1" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771" + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.0.6" + version: "3.1.2" uuid: dependency: transitive description: name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "4.4.2" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: ea8d3fc7b2e0f35de38a7465063ecfcf03d8217f7962aa2a6717132cb5d43a79 + sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752" url: "https://pub.dev" source: hosted - version: "1.1.5" + version: "1.1.10+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: a5eaa5d19e123ad4f61c3718ca1ed921c4e6254238d9145f82aa214955d9aced + sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33 url: "https://pub.dev" source: hosted - version: "1.1.5" + version: "1.1.10+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "15edc42f7eaa478ce854eaf1fbb9062a899c0e4e56e775dd73b7f4709c97c4ca" + sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a" url: "https://pub.dev" source: hosted - version: "1.1.5" + version: "1.1.10+1" vector_math: dependency: transitive description: @@ -1085,170 +1093,162 @@ packages: dependency: transitive description: name: video_player - sha256: de95f0e9405f29b5582573d4166132e71f83b3158aac14e8ee5767a54f4f1fbd + sha256: e30df0d226c4ef82e2c150ebf6834b3522cf3f654d8e2f9419d376cdc071425d url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.9.1" video_player_android: dependency: transitive description: name: video_player_android - sha256: f338a5a396c845f4632959511cad3542cdf3167e1b2a1a948ef07f7123c03608 + sha256: "4de50df9ee786f5891d3281e1e633d7b142ef1acf47392592eb91cba5d355849" url: "https://pub.dev" source: hosted - version: "2.4.9" + version: "2.6.0" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "4c274e439f349a0ee5cb3c42978393ede173a443b98f50de6ffe6900eaa19216" + sha256: d1e9a824f2b324000dc8fb2dcb2a3285b6c1c7c487521c63306cc5b394f68a7c url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.6.1" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: a8c4dcae2a7a6e7cc1d7f9808294d968eca1993af34a98e95b9bdfa959bec684 + sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6" url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.2" video_player_web: dependency: transitive description: name: video_player_web - sha256: "44ce41424d104dfb7cf6982cc6b84af2b007a24d126406025bf40de5d481c74c" + sha256: ff4d69a6614b03f055397c27a71c9d3ddea2b2a23d71b2ba0164f59ca32b8fe2 url: "https://pub.dev" source: hosted - version: "2.0.16" - wakelock: + version: "2.3.1" + vm_service: dependency: transitive description: - name: wakelock - sha256: "769ecf42eb2d07128407b50cb93d7c10bd2ee48f0276ef0119db1d25cc2f87db" + name: vm_service + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc url: "https://pub.dev" source: hosted - version: "0.6.2" - wakelock_macos: + version: "14.2.4" + wakelock_plus: dependency: transitive description: - name: wakelock_macos - sha256: "047c6be2f88cb6b76d02553bca5a3a3b95323b15d30867eca53a19a0a319d4cd" + name: wakelock_plus + sha256: "4fa83a128b4127619e385f686b4f080a5d2de46cff8e8c94eccac5fcf76550e5" url: "https://pub.dev" source: hosted - version: "0.4.0" - wakelock_platform_interface: + version: "1.2.7" + wakelock_plus_platform_interface: dependency: transitive description: - name: wakelock_platform_interface - sha256: "1f4aeb81fb592b863da83d2d0f7b8196067451e4df91046c26b54a403f9de621" + name: wakelock_plus_platform_interface + sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" url: "https://pub.dev" source: hosted - version: "0.3.0" - wakelock_web: - dependency: transitive - description: - name: wakelock_web - sha256: "1b256b811ee3f0834888efddfe03da8d18d0819317f20f6193e2922b41a501b5" - url: "https://pub.dev" - source: hosted - version: "0.4.0" - wakelock_windows: - dependency: transitive - description: - name: wakelock_windows - sha256: "857f77b3fe6ae82dd045455baa626bc4b93cb9bb6c86bf3f27c182167c3a5567" - url: "https://pub.dev" - source: hosted - version: "0.2.1" + version: "1.2.1" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" web: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.5.1" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "3.0.1" webview_flutter: dependency: transitive description: name: webview_flutter - sha256: "789d52bd789373cc1e100fb634af2127e86c99cf9abde09499743270c5de8d00" + sha256: "6869c8786d179f929144b4a1f86e09ac0eddfe475984951ea6c634774c16b522" url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.8.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: "532135f6f6b8030cd039f30eab23f340d650350e29f38e9b37d2eaad028f1018" + sha256: c66651fba15f9d7ddd31daec42da8d6bce46c85610a7127e3ebcb39a4395c3c9 url: "https://pub.dev" source: hosted - version: "3.8.0" + version: "3.16.6" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "656e2aeaef318900fffd21468b6ddc7958c7092a642f0e7220bac328b70d4a81" + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.10.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: ecc9e9ea15216afc5ba3b1f14aa19414ceba526e57b19cebd970bfa91a0f4058 + sha256: "9c62cc46fa4f2d41e10ab81014c1de470a6c6f26051a2de32111b2ee55287feb" url: "https://pub.dev" source: hosted - version: "3.5.0" + version: "3.14.0" win32: dependency: transitive description: name: win32 - sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + sha256: "015002c060f1ae9f41a818f2d5640389cc05283e368be19dc8d77cecb43c40c9" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "5.5.3" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1 + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.0.4" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.5.0" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" - flutter: ">=3.7.0" + dart: ">=3.5.0-259.0.dev <4.0.0" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4dd87dd..469a724 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -38,10 +38,10 @@ dependencies: openapi_generator_annotations: ^4.0.0 sqflite: provider: ^6.0.5 - carousel_slider: ^4.2.1 + #carousel_slider: ^4.2.1 #flutter_svg_provider: ^1.0.3 photo_view: ^0.14.0 - intl: ^0.18.0 + intl: ^0.19.0 flutter_launcher_icons: ^0.10.0 #audioplayers: ^2.0.0 just_audio: ^0.9.34