From d3e5ab7d613a59035886e238e069cf41af738bfb Mon Sep 17 00:00:00 2001 From: "mr.mojtaba" Date: Wed, 27 Aug 2025 11:56:29 +0330 Subject: [PATCH] feat : module page --- assets/icons/rasad_ban.svg | 10 + assets/icons/rasad_bar.svg | 6 + assets/icons/rasad_bot.svg | 16 + assets/icons/rasad_dam.svg | 18 + assets/icons/rasad_nan.svg | 507 ++++++++++++++++++ assets/icons/rasad_toyor.svg | 7 + assets/vec/rasad_ban.svg.vec | Bin 0 -> 1153 bytes assets/vec/rasad_bar.svg.vec | Bin 0 -> 1341 bytes assets/vec/rasad_bot.svg.vec | Bin 0 -> 1854 bytes assets/vec/rasad_dam.svg.vec | Bin 0 -> 6020 bytes assets/vec/rasad_nan.svg.vec | Bin 0 -> 81188 bytes assets/vec/rasad_toyor.svg.vec | Bin 0 -> 1124 bytes .../model/response/slider/slider_model.dart | 15 + .../response/slider/slider_model.freezed.dart | 296 ++++++++++ .../model/response/slider/slider_model.g.dart | 15 + lib/presentation/pages/modules/logic.dart | 98 +++- lib/presentation/pages/modules/view.dart | 57 +- lib/presentation/routes/app_pages.dart | 21 +- .../data/model/local/module/module_model.dart | 10 +- .../local/module/module_model.freezed.dart | 55 +- packages/core/lib/injection/di.dart | 5 +- .../lib/presentation/common/app_fonts.dart | 9 + .../lib/presentation/common/assets.gen.dart | 48 ++ .../card/card_with_icon_with_border.dart | 63 ++- .../lib/presentation/widget/slider/logic.dart | 45 ++ .../presentation/widget/slider/slider.dart | 2 + .../lib/presentation/widget/slider/view.dart | 80 +++ .../core/lib/presentation/widget/widget.dart | 1 + packages/core/lib/utils/number_utils.dart | 13 + packages/core/lib/utils/utils.dart | 1 + pubspec.lock | 8 + 31 files changed, 1313 insertions(+), 93 deletions(-) create mode 100644 assets/icons/rasad_ban.svg create mode 100644 assets/icons/rasad_bar.svg create mode 100644 assets/icons/rasad_bot.svg create mode 100644 assets/icons/rasad_dam.svg create mode 100644 assets/icons/rasad_nan.svg create mode 100644 assets/icons/rasad_toyor.svg create mode 100644 assets/vec/rasad_ban.svg.vec create mode 100644 assets/vec/rasad_bar.svg.vec create mode 100644 assets/vec/rasad_bot.svg.vec create mode 100644 assets/vec/rasad_dam.svg.vec create mode 100644 assets/vec/rasad_nan.svg.vec create mode 100644 assets/vec/rasad_toyor.svg.vec create mode 100644 lib/data/model/response/slider/slider_model.dart create mode 100644 lib/data/model/response/slider/slider_model.freezed.dart create mode 100644 lib/data/model/response/slider/slider_model.g.dart create mode 100644 packages/core/lib/presentation/widget/slider/logic.dart create mode 100644 packages/core/lib/presentation/widget/slider/slider.dart create mode 100644 packages/core/lib/presentation/widget/slider/view.dart create mode 100644 packages/core/lib/utils/number_utils.dart diff --git a/assets/icons/rasad_ban.svg b/assets/icons/rasad_ban.svg new file mode 100644 index 0000000..fd781ec --- /dev/null +++ b/assets/icons/rasad_ban.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/rasad_bar.svg b/assets/icons/rasad_bar.svg new file mode 100644 index 0000000..bc0a060 --- /dev/null +++ b/assets/icons/rasad_bar.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/icons/rasad_bot.svg b/assets/icons/rasad_bot.svg new file mode 100644 index 0000000..19f27a2 --- /dev/null +++ b/assets/icons/rasad_bot.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/icons/rasad_dam.svg b/assets/icons/rasad_dam.svg new file mode 100644 index 0000000..cf84209 --- /dev/null +++ b/assets/icons/rasad_dam.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/rasad_nan.svg b/assets/icons/rasad_nan.svg new file mode 100644 index 0000000..6fd8c7f --- /dev/null +++ b/assets/icons/rasad_nan.svg @@ -0,0 +1,507 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/rasad_toyor.svg b/assets/icons/rasad_toyor.svg new file mode 100644 index 0000000..d98e848 --- /dev/null +++ b/assets/icons/rasad_toyor.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/vec/rasad_ban.svg.vec b/assets/vec/rasad_ban.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..53a463188933843caeb1b0d6a1252d7aed9ca1ff GIT binary patch literal 1153 zcma)+Ye*GA6vtVB(=yj?YGyYj?O{bw*7>KQ_BOp>7Fn4QJ?Q-s`jTl6p{OW{ z2>lSG34IWYiUL1`MutRbo87W9Gb&99Q@qJGXK%OYTeC2~nK|eD&)LH;8>gNS$`m2i zLWu2%bfzn&CWL85R@@b)rts=U&2dvxdG(?Do2hAXr7J@C3prF(;h}}|=Hr(Znx6>l zXgE#oa|GXzD7upqWARAC0P+4}bTwW0QAShNI;q%hSnNIimz_hAC^}|Pfjbg=rQSTL z=hf8}MFespMU@{O_UYUrb@d2pmj<-10 zZ!zMlhUq|a21e}qL|>DZ!2fUy1zbx1lXpiK!o_Ab~p@m*T2(Xg^q5gL0g{a2s~)eOv!{x1`RanSSodDf0Om1 z2X0ZGV;sV+)>Ge51m-j}QT}V`7c2c_+}N@v+Sj0?vY?(iUPi#{ugl^*{glmAWub~@ z=dx?A7}UPPNu0;aXHtjHnK^XTVoTRLs{QN(X6J^d#N5LAK;PIv;+5 zTAc-yy7dtCUVKk{{_aSRMYijTkMObjrfA&1|Bti%6DLF)g-rTN9kau*|9ls@96H)p z>?A%PE_GUDyRP_(5uDF+mqK}2dMFw01u1x*un0k`S6RH7y$b5jEF2A5kIGiyX6Jr9 zpy?R-b~9!q+Yz3>4B3do9b};I-c%IFr^2hF%M3v*EbjuhnCE1=cG&@@>%~iAuIW!DwvQLnQ`n#Ru-O4-)4E)Axl@VB{>;X52iVTKUVUc$+@gim zeT5e9R~=ng7gk72j$>wLMS<;cv6)sJGwWm&m=p6d!FDG5GdaHhR1{d(t3S=UIi_h> d1V0*fRsN%d{9}fX;8(+L^VobnHg3IX{sL0LpXdMp literal 0 HcmV?d00001 diff --git a/assets/vec/rasad_bar.svg.vec b/assets/vec/rasad_bar.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..fea5942751ed0c83595acb999b8cf78d6b5389fd GIT binary patch literal 1341 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 MK+4gp&_Txd4;|#KQ2+n{ literal 0 HcmV?d00001 diff --git a/assets/vec/rasad_dam.svg.vec b/assets/vec/rasad_dam.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..d298a1c106d86509af62c676a7e2b3b9ac8b0999 GIT binary patch literal 6020 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 literal 0 HcmV?d00001 diff --git a/assets/vec/rasad_nan.svg.vec b/assets/vec/rasad_nan.svg.vec new file mode 100644 index 0000000000000000000000000000000000000000..0452acfd951202d52dbe832812a96ecb276a155f GIT binary patch literal 81188 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 up, + List? down, + }) = _SliderModel; + + factory SliderModel.fromJson(Map json) => + _$SliderModelFromJson(json); +} diff --git a/lib/data/model/response/slider/slider_model.freezed.dart b/lib/data/model/response/slider/slider_model.freezed.dart new file mode 100644 index 0000000..ff8f57a --- /dev/null +++ b/lib/data/model/response/slider/slider_model.freezed.dart @@ -0,0 +1,296 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND +// coverage:ignore-file +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'slider_model.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +// dart format off +T _$identity(T value) => value; + +/// @nodoc +mixin _$SliderModel { + + List? get up; List? get down; +/// Create a copy of SliderModel +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$SliderModelCopyWith get copyWith => _$SliderModelCopyWithImpl(this as SliderModel, _$identity); + + /// Serializes this SliderModel to a JSON map. + Map toJson(); + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is SliderModel&&const DeepCollectionEquality().equals(other.up, up)&&const DeepCollectionEquality().equals(other.down, down)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(up),const DeepCollectionEquality().hash(down)); + +@override +String toString() { + return 'SliderModel(up: $up, down: $down)'; +} + + +} + +/// @nodoc +abstract mixin class $SliderModelCopyWith<$Res> { + factory $SliderModelCopyWith(SliderModel value, $Res Function(SliderModel) _then) = _$SliderModelCopyWithImpl; +@useResult +$Res call({ + List? up, List? down +}); + + + + +} +/// @nodoc +class _$SliderModelCopyWithImpl<$Res> + implements $SliderModelCopyWith<$Res> { + _$SliderModelCopyWithImpl(this._self, this._then); + + final SliderModel _self; + final $Res Function(SliderModel) _then; + +/// Create a copy of SliderModel +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') @override $Res call({Object? up = freezed,Object? down = freezed,}) { + return _then(_self.copyWith( +up: freezed == up ? _self.up : up // ignore: cast_nullable_to_non_nullable +as List?,down: freezed == down ? _self.down : down // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + +} + + +/// Adds pattern-matching-related methods to [SliderModel]. +extension SliderModelPatterns on SliderModel { +/// A variant of `map` that fallback to returning `orElse`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeMap(TResult Function( _SliderModel value)? $default,{required TResult orElse(),}){ +final _that = this; +switch (_that) { +case _SliderModel() when $default != null: +return $default(_that);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// Callbacks receives the raw object, upcasted. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case final Subclass2 value: +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult map(TResult Function( _SliderModel value) $default,){ +final _that = this; +switch (_that) { +case _SliderModel(): +return $default(_that);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `map` that fallback to returning `null`. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case final Subclass value: +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? mapOrNull(TResult? Function( _SliderModel value)? $default,){ +final _that = this; +switch (_that) { +case _SliderModel() when $default != null: +return $default(_that);case _: + return null; + +} +} +/// A variant of `when` that fallback to an `orElse` callback. +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return orElse(); +/// } +/// ``` + +@optionalTypeArgs TResult maybeWhen(TResult Function( List? up, List? down)? $default,{required TResult orElse(),}) {final _that = this; +switch (_that) { +case _SliderModel() when $default != null: +return $default(_that.up,_that.down);case _: + return orElse(); + +} +} +/// A `switch`-like method, using callbacks. +/// +/// As opposed to `map`, this offers destructuring. +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case Subclass2(:final field2): +/// return ...; +/// } +/// ``` + +@optionalTypeArgs TResult when(TResult Function( List? up, List? down) $default,) {final _that = this; +switch (_that) { +case _SliderModel(): +return $default(_that.up,_that.down);case _: + throw StateError('Unexpected subclass'); + +} +} +/// A variant of `when` that fallback to returning `null` +/// +/// It is equivalent to doing: +/// ```dart +/// switch (sealedClass) { +/// case Subclass(:final field): +/// return ...; +/// case _: +/// return null; +/// } +/// ``` + +@optionalTypeArgs TResult? whenOrNull(TResult? Function( List? up, List? down)? $default,) {final _that = this; +switch (_that) { +case _SliderModel() when $default != null: +return $default(_that.up,_that.down);case _: + return null; + +} +} + +} + +/// @nodoc +@JsonSerializable() + +class _SliderModel implements SliderModel { + const _SliderModel({final List? up, final List? down}): _up = up,_down = down; + factory _SliderModel.fromJson(Map json) => _$SliderModelFromJson(json); + + final List? _up; +@override List? get up { + final value = _up; + if (value == null) return null; + if (_up is EqualUnmodifiableListView) return _up; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + final List? _down; +@override List? get down { + final value = _down; + if (value == null) return null; + if (_down is EqualUnmodifiableListView) return _down; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(value); +} + + +/// Create a copy of SliderModel +/// with the given fields replaced by the non-null parameter values. +@override @JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +_$SliderModelCopyWith<_SliderModel> get copyWith => __$SliderModelCopyWithImpl<_SliderModel>(this, _$identity); + +@override +Map toJson() { + return _$SliderModelToJson(this, ); +} + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is _SliderModel&&const DeepCollectionEquality().equals(other._up, _up)&&const DeepCollectionEquality().equals(other._down, _down)); +} + +@JsonKey(includeFromJson: false, includeToJson: false) +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(_up),const DeepCollectionEquality().hash(_down)); + +@override +String toString() { + return 'SliderModel(up: $up, down: $down)'; +} + + +} + +/// @nodoc +abstract mixin class _$SliderModelCopyWith<$Res> implements $SliderModelCopyWith<$Res> { + factory _$SliderModelCopyWith(_SliderModel value, $Res Function(_SliderModel) _then) = __$SliderModelCopyWithImpl; +@override @useResult +$Res call({ + List? up, List? down +}); + + + + +} +/// @nodoc +class __$SliderModelCopyWithImpl<$Res> + implements _$SliderModelCopyWith<$Res> { + __$SliderModelCopyWithImpl(this._self, this._then); + + final _SliderModel _self; + final $Res Function(_SliderModel) _then; + +/// Create a copy of SliderModel +/// with the given fields replaced by the non-null parameter values. +@override @pragma('vm:prefer-inline') $Res call({Object? up = freezed,Object? down = freezed,}) { + return _then(_SliderModel( +up: freezed == up ? _self._up : up // ignore: cast_nullable_to_non_nullable +as List?,down: freezed == down ? _self._down : down // ignore: cast_nullable_to_non_nullable +as List?, + )); +} + + +} + +// dart format on diff --git a/lib/data/model/response/slider/slider_model.g.dart b/lib/data/model/response/slider/slider_model.g.dart new file mode 100644 index 0000000..bd1d453 --- /dev/null +++ b/lib/data/model/response/slider/slider_model.g.dart @@ -0,0 +1,15 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'slider_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_SliderModel _$SliderModelFromJson(Map json) => _SliderModel( + up: (json['up'] as List?)?.map((e) => e as String).toList(), + down: (json['down'] as List?)?.map((e) => e as String).toList(), +); + +Map _$SliderModelToJson(_SliderModel instance) => + {'up': instance.up, 'down': instance.down}; diff --git a/lib/presentation/pages/modules/logic.dart b/lib/presentation/pages/modules/logic.dart index fb622c6..362a751 100644 --- a/lib/presentation/pages/modules/logic.dart +++ b/lib/presentation/pages/modules/logic.dart @@ -1,38 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:rasadyar_app/data/model/response/slider/slider_model.dart'; import 'package:rasadyar_app/presentation/routes/app_pages.dart'; import 'package:rasadyar_core/core.dart'; class ModulesLogic extends GetxController { TokenStorageService tokenService = Get.find(); + SliderLogic upSlider = Get.find(tag: "up"); + SliderLogic downSlider = Get.find(tag: "down"); RxBool isLoading = false.obs; List moduleList = [ - ModuleModel(title: 'بازرسی', icon: Assets.icons.inspection.path, module: Module.inspection), - ModuleModel(title: 'دام', icon: Assets.icons.liveStock.path, module: Module.liveStocks), - ModuleModel(title: 'مرغ', icon: Assets.icons.liveStock.path, module: Module.chicken), + ModuleModel( + title: 'رصدطیور', + icon: Assets.icons.rasadToyor.path, + module: Module.chicken, + borderColor: Color(0xFF4665AF), + backgroundColor: Color(0xFFECEEF2), + titleColor: Color(0xFF4665AF), + ), + ModuleModel( + title: 'رصدام', + icon: Assets.icons.rasadDam.path, + module: Module.liveStocks, + borderColor: Color(0xFFD7A972), + backgroundColor: Color(0xFFF4F1EF), + titleColor: Color(0xFF7F7F7F), + ), + ModuleModel( + title: 'رصدبان', + icon: Assets.icons.rasadBan.path, + module: Module.inspection, + borderColor: Color(0xFF014856), + backgroundColor: Color(0xFFE9EDED), + titleColor: Color(0xFF014856), + ), + ModuleModel( + title: 'رصدبار', + icon: Assets.icons.rasadBar.path, + borderColor: Color(0xFFF37021), + backgroundColor: Color(0xFFFFECE1), + titleColor: Color(0xFFF37021), + ), + ModuleModel( + title: 'رصدبات', + icon: Assets.icons.rasadBot.path, + borderColor: Color(0xFF4A148C), + backgroundColor: Color(0xFFEDEAF0), + titleColor: Color(0xFF4A148C), + ), + ModuleModel( + title: 'رصدنان', + icon: Assets.icons.rasadNan.path, + borderColor: Color(0xFFD7A972), + backgroundColor: Color(0xFFF4F2EA), + titleColor: Color(0xFF8E8E8E), + ), ]; RxnInt selectedIndex = RxnInt(null); @override - void onReady() { - super.onReady(); + void onInit() { + super.onInit(); + getSliders(); } - @override - void onClose() { - super.onClose(); - } void saveModule(Module module) { tokenService.saveModule(module); tokenService.appModule.value = module; } - void onTapCard(Module module, int index) async { - isLoading.value = !isLoading.value; + void onTapCard(Module? module, int index) async { + if (module == null) { + Get.snackbar("بزودی", "این ماژول به زودی اضافه می‌شود", snackPosition: SnackPosition.BOTTOM); + } else { + _goToModule(module, index); + } + } + + void _goToModule(Module module, int index) async { selectedIndex.value = index; - await Future.delayed(Duration(milliseconds: 200)); // Simulate loading delay - navigateToModule(module); + await Future.delayed(Duration(milliseconds: 300)); + selectedIndex.value = null; + saveModule(module); + await navigateToModule(module); } Future navigateToModule(Module module) async { @@ -44,4 +96,24 @@ class ModulesLogic extends GetxController { isLoading.value = !isLoading.value; Get.toNamed(target.key, arguments: module); } + + Future getSliders() async { + var dio = Dio(); + dio.interceptors.add( + PrettyDioLogger( + request: true, + enabled: true, + requestHeader: true, + responseHeader: true, + requestBody: true, + responseBody: true, + ), + ); + var res = await dio.get("https://miran.storage.c2.liara.space/app/urllapp.json"); + if (res.statusCode == 200) { + SliderModel sliderModel = SliderModel.fromJson(res.data); + upSlider.onSuccess(sliderModel.up ?? []); + downSlider.onSuccess(sliderModel.down ?? []); + } + } } diff --git a/lib/presentation/pages/modules/view.dart b/lib/presentation/pages/modules/view.dart index 6ff320a..bba39ed 100644 --- a/lib/presentation/pages/modules/view.dart +++ b/lib/presentation/pages/modules/view.dart @@ -11,7 +11,13 @@ class ModulesPage extends GetView { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('انتخاب سامانه', style: AppFonts.yekan18.copyWith(color: Colors.white)), + title: Row( + spacing: 5.w, + children: [ + Text('سامانه جامع رصدیار', style: AppFonts.yekan18Bold.copyWith(color: Colors.white)), + Assets.logos.finalLogo.image(width: 40.w, height: 40.h), + ], + ), centerTitle: true, backgroundColor: AppColor.blueNormal, ), @@ -19,23 +25,40 @@ class ModulesPage extends GetView { fit: StackFit.expand, alignment: Alignment.center, children: [ - GridView.builder( - padding: EdgeInsets.symmetric(horizontal: 10, vertical: 20), - itemBuilder: (context, index) { - final module = controller.moduleList[index]; - return CardIcon( - title: module.title, - icon: module.icon, - onTap: () => controller.onTapCard(module.module, index), - ); - }, - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - mainAxisSpacing: 10, - crossAxisSpacing: 10, + Positioned.fill( + child: Column( + children: [ + SizedBox(height: 24.h), + SliderWidget(widgetTag: "up"), + + Expanded( + child: GridView.builder( + padding: EdgeInsets.symmetric(horizontal: 25.w, vertical: 24.h), + itemBuilder: (context, index) { + final module = controller.moduleList[index]; + return CardIcon( + title: module.title, + icon: module.icon, + borderColor: module.borderColor, + backgroundColor: module.backgroundColor, + titleColor: module.titleColor, + onTap: () => controller.onTapCard(module.module, index), + ); + }, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + mainAxisSpacing: 24.h, + crossAxisSpacing: 16.w, + ), + physics: BouncingScrollPhysics(), + itemCount: controller.moduleList.length, + ), + ), + + SliderWidget(height: 160, widgetTag: "down"), + SizedBox(height: 30.h), + ], ), - physics: BouncingScrollPhysics(), - itemCount: controller.moduleList.length, ), ObxValue((loading) { if (!controller.isLoading.value) return SizedBox.shrink(); diff --git a/lib/presentation/routes/app_pages.dart b/lib/presentation/routes/app_pages.dart index 66ab559..4a11fb2 100644 --- a/lib/presentation/routes/app_pages.dart +++ b/lib/presentation/routes/app_pages.dart @@ -25,7 +25,12 @@ sealed class AppPages { GetPage( name: AppPaths.moduleList, page: () => ModulesPage(), - binding: BindingsBuilder.put(() => ModulesLogic()), + binding: BindingsBuilder(() { + + Get.lazyPut(() => SliderLogic(), tag: "up"); + Get.lazyPut(() => SliderLogic(), tag: "down"); + Get.put(ModulesLogic()); + }), ), GetPage( @@ -35,35 +40,33 @@ sealed class AppPages { ), ...InspectionPages.pages, - ...LiveStockPages.pages, ...ChickenPages.pages, ]; } - Map?> getTargetModule(Module? value) { switch (value) { case Module.inspection: - return {InspectionRoutes.init:setupInspectionDI()}; + return {InspectionRoutes.init: setupInspectionDI()}; case Module.liveStocks: return {LiveStockRoutes.init: setupLiveStockDI()}; case Module.chicken: - return {ChickenRoutes.init : setupChickenDI()}; + return {ChickenRoutes.init: setupChickenDI()}; default: - return {AppPaths.moduleList : null}; + return {AppPaths.moduleList: null}; } } Map?> getAuthTargetPage(Module? value) { switch (value) { case Module.inspection: - return {InspectionRoutes.auth:setupInspectionDI()}; + return {InspectionRoutes.auth: setupInspectionDI()}; case Module.liveStocks: return {LiveStockRoutes.auth: setupLiveStockDI()}; case Module.chicken: - return {ChickenRoutes.auth : setupChickenDI()}; + return {ChickenRoutes.auth: setupChickenDI()}; default: - return {AppPaths.moduleList : null}; + return {AppPaths.moduleList: null}; } } diff --git a/packages/core/lib/data/model/local/module/module_model.dart b/packages/core/lib/data/model/local/module/module_model.dart index 3ca5760..2d036cc 100644 --- a/packages/core/lib/data/model/local/module/module_model.dart +++ b/packages/core/lib/data/model/local/module/module_model.dart @@ -1,16 +1,18 @@ -import 'package:flutter/material.dart'; import 'package:rasadyar_core/core.dart'; -import 'package:rasadyar_core/data/model/local/user_local/user_local_model.dart'; +import 'package:flutter/material.dart'; part 'module_model.freezed.dart'; @freezed abstract class ModuleModel with _$ModuleModel{ - const factory ModuleModel({ + factory ModuleModel({ required String title, required String icon, - required Module module, + required Color borderColor, + required Color backgroundColor, + required Color titleColor, + Module? module, }) = _ModuleModel; } \ No newline at end of file diff --git a/packages/core/lib/data/model/local/module/module_model.freezed.dart b/packages/core/lib/data/model/local/module/module_model.freezed.dart index aedd18f..28a5bdd 100644 --- a/packages/core/lib/data/model/local/module/module_model.freezed.dart +++ b/packages/core/lib/data/model/local/module/module_model.freezed.dart @@ -14,7 +14,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$ModuleModel { - String get title; String get icon; Module get module; + String get title; String get icon; Color get borderColor; Color get backgroundColor; Color get titleColor; Module? get module; /// Create a copy of ModuleModel /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -25,16 +25,16 @@ $ModuleModelCopyWith get copyWith => _$ModuleModelCopyWithImpl Object.hash(runtimeType,title,icon,module); +int get hashCode => Object.hash(runtimeType,title,icon,borderColor,backgroundColor,titleColor,module); @override String toString() { - return 'ModuleModel(title: $title, icon: $icon, module: $module)'; + return 'ModuleModel(title: $title, icon: $icon, borderColor: $borderColor, backgroundColor: $backgroundColor, titleColor: $titleColor, module: $module)'; } @@ -45,7 +45,7 @@ abstract mixin class $ModuleModelCopyWith<$Res> { factory $ModuleModelCopyWith(ModuleModel value, $Res Function(ModuleModel) _then) = _$ModuleModelCopyWithImpl; @useResult $Res call({ - String title, String icon, Module module + String title, String icon, Color borderColor, Color backgroundColor, Color titleColor, Module? module }); @@ -62,12 +62,15 @@ class _$ModuleModelCopyWithImpl<$Res> /// Create a copy of ModuleModel /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? title = null,Object? icon = null,Object? module = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? title = null,Object? icon = null,Object? borderColor = null,Object? backgroundColor = null,Object? titleColor = null,Object? module = freezed,}) { return _then(_self.copyWith( title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable as String,icon: null == icon ? _self.icon : icon // ignore: cast_nullable_to_non_nullable -as String,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable -as Module, +as String,borderColor: null == borderColor ? _self.borderColor : borderColor // ignore: cast_nullable_to_non_nullable +as Color,backgroundColor: null == backgroundColor ? _self.backgroundColor : backgroundColor // ignore: cast_nullable_to_non_nullable +as Color,titleColor: null == titleColor ? _self.titleColor : titleColor // ignore: cast_nullable_to_non_nullable +as Color,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as Module?, )); } @@ -152,10 +155,10 @@ return $default(_that);case _: /// } /// ``` -@optionalTypeArgs TResult maybeWhen(TResult Function( String title, String icon, Module module)? $default,{required TResult orElse(),}) {final _that = this; +@optionalTypeArgs TResult maybeWhen(TResult Function( String title, String icon, Color borderColor, Color backgroundColor, Color titleColor, Module? module)? $default,{required TResult orElse(),}) {final _that = this; switch (_that) { case _ModuleModel() when $default != null: -return $default(_that.title,_that.icon,_that.module);case _: +return $default(_that.title,_that.icon,_that.borderColor,_that.backgroundColor,_that.titleColor,_that.module);case _: return orElse(); } @@ -173,10 +176,10 @@ return $default(_that.title,_that.icon,_that.module);case _: /// } /// ``` -@optionalTypeArgs TResult when(TResult Function( String title, String icon, Module module) $default,) {final _that = this; +@optionalTypeArgs TResult when(TResult Function( String title, String icon, Color borderColor, Color backgroundColor, Color titleColor, Module? module) $default,) {final _that = this; switch (_that) { case _ModuleModel(): -return $default(_that.title,_that.icon,_that.module);case _: +return $default(_that.title,_that.icon,_that.borderColor,_that.backgroundColor,_that.titleColor,_that.module);case _: throw StateError('Unexpected subclass'); } @@ -193,10 +196,10 @@ return $default(_that.title,_that.icon,_that.module);case _: /// } /// ``` -@optionalTypeArgs TResult? whenOrNull(TResult? Function( String title, String icon, Module module)? $default,) {final _that = this; +@optionalTypeArgs TResult? whenOrNull(TResult? Function( String title, String icon, Color borderColor, Color backgroundColor, Color titleColor, Module? module)? $default,) {final _that = this; switch (_that) { case _ModuleModel() when $default != null: -return $default(_that.title,_that.icon,_that.module);case _: +return $default(_that.title,_that.icon,_that.borderColor,_that.backgroundColor,_that.titleColor,_that.module);case _: return null; } @@ -208,12 +211,15 @@ return $default(_that.title,_that.icon,_that.module);case _: class _ModuleModel implements ModuleModel { - const _ModuleModel({required this.title, required this.icon, required this.module}); + _ModuleModel({required this.title, required this.icon, required this.borderColor, required this.backgroundColor, required this.titleColor, this.module}); @override final String title; @override final String icon; -@override final Module module; +@override final Color borderColor; +@override final Color backgroundColor; +@override final Color titleColor; +@override final Module? module; /// Create a copy of ModuleModel /// with the given fields replaced by the non-null parameter values. @@ -225,16 +231,16 @@ _$ModuleModelCopyWith<_ModuleModel> get copyWith => __$ModuleModelCopyWithImpl<_ @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _ModuleModel&&(identical(other.title, title) || other.title == title)&&(identical(other.icon, icon) || other.icon == icon)&&(identical(other.module, module) || other.module == module)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _ModuleModel&&(identical(other.title, title) || other.title == title)&&(identical(other.icon, icon) || other.icon == icon)&&(identical(other.borderColor, borderColor) || other.borderColor == borderColor)&&(identical(other.backgroundColor, backgroundColor) || other.backgroundColor == backgroundColor)&&(identical(other.titleColor, titleColor) || other.titleColor == titleColor)&&(identical(other.module, module) || other.module == module)); } @override -int get hashCode => Object.hash(runtimeType,title,icon,module); +int get hashCode => Object.hash(runtimeType,title,icon,borderColor,backgroundColor,titleColor,module); @override String toString() { - return 'ModuleModel(title: $title, icon: $icon, module: $module)'; + return 'ModuleModel(title: $title, icon: $icon, borderColor: $borderColor, backgroundColor: $backgroundColor, titleColor: $titleColor, module: $module)'; } @@ -245,7 +251,7 @@ abstract mixin class _$ModuleModelCopyWith<$Res> implements $ModuleModelCopyWith factory _$ModuleModelCopyWith(_ModuleModel value, $Res Function(_ModuleModel) _then) = __$ModuleModelCopyWithImpl; @override @useResult $Res call({ - String title, String icon, Module module + String title, String icon, Color borderColor, Color backgroundColor, Color titleColor, Module? module }); @@ -262,12 +268,15 @@ class __$ModuleModelCopyWithImpl<$Res> /// Create a copy of ModuleModel /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? title = null,Object? icon = null,Object? module = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? title = null,Object? icon = null,Object? borderColor = null,Object? backgroundColor = null,Object? titleColor = null,Object? module = freezed,}) { return _then(_ModuleModel( title: null == title ? _self.title : title // ignore: cast_nullable_to_non_nullable as String,icon: null == icon ? _self.icon : icon // ignore: cast_nullable_to_non_nullable -as String,module: null == module ? _self.module : module // ignore: cast_nullable_to_non_nullable -as Module, +as String,borderColor: null == borderColor ? _self.borderColor : borderColor // ignore: cast_nullable_to_non_nullable +as Color,backgroundColor: null == backgroundColor ? _self.backgroundColor : backgroundColor // ignore: cast_nullable_to_non_nullable +as Color,titleColor: null == titleColor ? _self.titleColor : titleColor // ignore: cast_nullable_to_non_nullable +as Color,module: freezed == module ? _self.module : module // ignore: cast_nullable_to_non_nullable +as Module?, )); } diff --git a/packages/core/lib/injection/di.dart b/packages/core/lib/injection/di.dart index 1e31ba5..c7bc829 100644 --- a/packages/core/lib/injection/di.dart +++ b/packages/core/lib/injection/di.dart @@ -11,9 +11,8 @@ Future setupAllCoreProvider() async { diCore.registerSingleton(NetworkStatus()..startListening()); //max 500MB Map Cashing - await diCore.registerSingleton( - FMTCObjectBoxBackend().initialise(maxDatabaseSize: 500 * 1024 * 1024), - ); + await FMTCObjectBoxBackend().initialise(); + diff --git a/packages/core/lib/presentation/common/app_fonts.dart b/packages/core/lib/presentation/common/app_fonts.dart index 72c1d45..cd31938 100644 --- a/packages/core/lib/presentation/common/app_fonts.dart +++ b/packages/core/lib/presentation/common/app_fonts.dart @@ -166,6 +166,15 @@ class AppFonts { height: _height, ); + + static TextStyle yekan18Bold = TextStyle( + fontFamily: yekan, + fontWeight: bold, // Use bold weight + fontSize: 18.sp, + height: _height, + ); + + static TextStyle yekan16Bold = TextStyle( // Base size bold fontFamily: yekan, diff --git a/packages/core/lib/presentation/common/assets.gen.dart b/packages/core/lib/presentation/common/assets.gen.dart index b349f7c..0ea224c 100644 --- a/packages/core/lib/presentation/common/assets.gen.dart +++ b/packages/core/lib/presentation/common/assets.gen.dart @@ -211,6 +211,24 @@ class $AssetsIconsGen { /// File path: assets/icons/profile_user.svg SvgGenImage get profileUser => const SvgGenImage('assets/icons/profile_user.svg'); + /// File path: assets/icons/rasad_ban.svg + SvgGenImage get rasadBan => const SvgGenImage('assets/icons/rasad_ban.svg'); + + /// File path: assets/icons/rasad_bar.svg + SvgGenImage get rasadBar => const SvgGenImage('assets/icons/rasad_bar.svg'); + + /// File path: assets/icons/rasad_bot.svg + SvgGenImage get rasadBot => const SvgGenImage('assets/icons/rasad_bot.svg'); + + /// File path: assets/icons/rasad_dam.svg + SvgGenImage get rasadDam => const SvgGenImage('assets/icons/rasad_dam.svg'); + + /// File path: assets/icons/rasad_nan.svg + SvgGenImage get rasadNan => const SvgGenImage('assets/icons/rasad_nan.svg'); + + /// File path: assets/icons/rasad_toyor.svg + SvgGenImage get rasadToyor => const SvgGenImage('assets/icons/rasad_toyor.svg'); + /// File path: assets/icons/receipt_discount.svg SvgGenImage get receiptDiscount => const SvgGenImage('assets/icons/receipt_discount.svg'); @@ -339,6 +357,12 @@ class $AssetsIconsGen { profile2Outline, profileCircle, profileUser, + rasadBan, + rasadBar, + rasadBot, + rasadDam, + rasadNan, + rasadToyor, receiptDiscount, sale, scan, @@ -576,6 +600,24 @@ class $AssetsVecGen { /// File path: assets/vec/profile_user.svg.vec SvgGenImage get profileUserSvg => const SvgGenImage.vec('assets/vec/profile_user.svg.vec'); + /// File path: assets/vec/rasad_ban.svg.vec + SvgGenImage get rasadBanSvg => const SvgGenImage.vec('assets/vec/rasad_ban.svg.vec'); + + /// File path: assets/vec/rasad_bar.svg.vec + SvgGenImage get rasadBarSvg => const SvgGenImage.vec('assets/vec/rasad_bar.svg.vec'); + + /// File path: assets/vec/rasad_bot.svg.vec + SvgGenImage get rasadBotSvg => const SvgGenImage.vec('assets/vec/rasad_bot.svg.vec'); + + /// File path: assets/vec/rasad_dam.svg.vec + SvgGenImage get rasadDamSvg => const SvgGenImage.vec('assets/vec/rasad_dam.svg.vec'); + + /// File path: assets/vec/rasad_nan.svg.vec + SvgGenImage get rasadNanSvg => const SvgGenImage.vec('assets/vec/rasad_nan.svg.vec'); + + /// File path: assets/vec/rasad_toyor.svg.vec + SvgGenImage get rasadToyorSvg => const SvgGenImage.vec('assets/vec/rasad_toyor.svg.vec'); + /// File path: assets/vec/receipt_discount.svg.vec SvgGenImage get receiptDiscountSvg => const SvgGenImage.vec('assets/vec/receipt_discount.svg.vec'); @@ -704,6 +746,12 @@ class $AssetsVecGen { profile2OutlineSvg, profileCircleSvg, profileUserSvg, + rasadBanSvg, + rasadBarSvg, + rasadBotSvg, + rasadDamSvg, + rasadNanSvg, + rasadToyorSvg, receiptDiscountSvg, saleSvg, scanSvg, diff --git a/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart b/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart index ca7d2b6..6986431 100644 --- a/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart +++ b/packages/core/lib/presentation/widget/card/card_with_icon_with_border.dart @@ -7,38 +7,53 @@ class CardIcon extends StatelessWidget { required this.title, required this.icon, this.onTap, + this.titleColor = AppColor.blueNormal, + this.titleStyle, + this.borderColor = AppColor.blueNormal, + this.backgroundColor = Colors.white, + this.borderRadius = 8, + this.width = 110, + this.height = 110, + this.borderWidth = 1, }); final String title; final String icon; final VoidCallback? onTap; + final Color titleColor; + final TextStyle? titleStyle; + + final Color borderColor; + final Color backgroundColor; + final double borderRadius; + final double borderWidth; + + final double width; + final double height; @override Widget build(BuildContext context) { - return InkWell( - onTap: onTap, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8), - side: const BorderSide(color: AppColor.blueNormal, width: 1), - ), - child: Container( - padding: const EdgeInsets.all(8), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(8), - color: Colors.white, - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SvgGenImage(icon).svg(width: 50, height: 50), - const SizedBox(height: 8), - Text( - title, - style: AppFonts.yekan16.copyWith(color: AppColor.blueNormal), - ), - ], - ), + return Container( + clipBehavior: Clip.hardEdge, + padding: EdgeInsets.fromLTRB(17.w, 10.h, 17.w, 8.h), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(borderRadius.r), + color: backgroundColor, + border: Border.all(color: borderColor, width: borderWidth.w), + ), + child: InkWell( + onTap: onTap, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded(child: SvgGenImage(icon).svg(fit: BoxFit.fill)), + SizedBox(height: 10.h), + Text( + title, + textAlign: TextAlign.center, + style: titleStyle ?? AppFonts.yekan16Bold.copyWith(color: titleColor, height: 1.20), + ), + ], ), ), ); diff --git a/packages/core/lib/presentation/widget/slider/logic.dart b/packages/core/lib/presentation/widget/slider/logic.dart new file mode 100644 index 0000000..28ec188 --- /dev/null +++ b/packages/core/lib/presentation/widget/slider/logic.dart @@ -0,0 +1,45 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class SliderLogic extends GetxController with StateMixin> { + final PageController pageController = PageController(initialPage: 0, viewportFraction: .93); + late Timer _timer; + late Duration duration; + + @override + void onInit() { + super.onInit(); + + duration = Duration(seconds: randomInt(8, 18)); + } + + void _startSliding(int itemCount) { + _timer = Timer.periodic(duration, (timer) { + if (pageController.hasClients) { + int nextPage = pageController.page!.round() + 1; + if (nextPage == itemCount) { + nextPage = 0; + } + pageController.animateToPage( + nextPage, + duration: Duration(milliseconds: 300), + curve: Curves.easeIn, + ); + } + }); + } + + @override + void onClose() { + _timer.cancel(); + pageController.dispose(); + super.onClose(); + } + + void onSuccess(List data) { + change(data, status: RxStatus.success()); + _startSliding(data.length); + } +} diff --git a/packages/core/lib/presentation/widget/slider/slider.dart b/packages/core/lib/presentation/widget/slider/slider.dart new file mode 100644 index 0000000..fe087c2 --- /dev/null +++ b/packages/core/lib/presentation/widget/slider/slider.dart @@ -0,0 +1,2 @@ +export 'logic.dart'; +export 'view.dart'; \ No newline at end of file diff --git a/packages/core/lib/presentation/widget/slider/view.dart b/packages/core/lib/presentation/widget/slider/view.dart new file mode 100644 index 0000000..ad438be --- /dev/null +++ b/packages/core/lib/presentation/widget/slider/view.dart @@ -0,0 +1,80 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:rasadyar_core/core.dart'; + +class SliderWidget extends GetView { + const SliderWidget({super.key, this.height = 210, this.widgetTag}); + + final int height; + final String? widgetTag; + + @override + String? get tag => widgetTag; + + @override + Widget build(BuildContext context) { + return SizedBox( + height: height.h, + child: controller.obx( + (state) => Stack( + alignment: AlignmentDirectional.bottomCenter, + fit: StackFit.expand, + children: [ + Positioned.fill( + child: PageView.builder( + controller: controller.pageController, + itemCount: state?.length ?? 0, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) { + String? image = state?[index]; + return Container( + height: height.h, + margin: EdgeInsets.symmetric(horizontal: 6.w), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.r), + image: DecorationImage(fit: BoxFit.fill, image: NetworkImage(image ?? '')), + ), + ); + }, + ), + ), + Visibility( + visible: (state?.length ?? 0) > 1, + child: Positioned( + bottom: 5, + child: Container( + height: 13.36, + padding: const EdgeInsets.symmetric(horizontal: 8), + margin: const EdgeInsets.symmetric(vertical: 12), + decoration: ShapeDecoration( + color: Colors.white38, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(9999)), + ), + child: SmoothPageIndicator( + controller: controller.pageController, // PageController + count: state?.length ?? 0, + effect: const WormEffect( + dotWidth: 6.0, + dotHeight: 6.0, + activeDotColor: Colors.white, + dotColor: Colors.white38, + ), // your preferred effect + onDotClicked: (index) { + controller.pageController.animateToPage( + index, + duration: const Duration(milliseconds: 500), + curve: Curves.easeIn, + ); + }, + ), + ), + ), + ), + ], + ), + onLoading: const Center(child: CupertinoActivityIndicator(color: AppColor.blueNormal)), + onError: (error) => Center(child: Text('خطا در بارگذاری اسلایدر: $error')), + ), + ); + } +} diff --git a/packages/core/lib/presentation/widget/widget.dart b/packages/core/lib/presentation/widget/widget.dart index 32b68cb..2564871 100644 --- a/packages/core/lib/presentation/widget/widget.dart +++ b/packages/core/lib/presentation/widget/widget.dart @@ -32,3 +32,4 @@ export 'tabs/new_tab.dart'; export 'tabs/r_segment.dart'; export 'tabs/tab.dart'; export 'vec_widget.dart'; +export 'slider/slider.dart'; \ No newline at end of file diff --git a/packages/core/lib/utils/number_utils.dart b/packages/core/lib/utils/number_utils.dart new file mode 100644 index 0000000..c44012f --- /dev/null +++ b/packages/core/lib/utils/number_utils.dart @@ -0,0 +1,13 @@ +import 'dart:math'; + +final _random = Random(); + + +int randomInt(int min, int max) { + return min + _random.nextInt(max - min + 1); +} + + +double randomDouble(double min, double max) { + return min + _random.nextDouble() * (max - min); +} \ No newline at end of file diff --git a/packages/core/lib/utils/utils.dart b/packages/core/lib/utils/utils.dart index 40b6ed5..cbb70e5 100644 --- a/packages/core/lib/utils/utils.dart +++ b/packages/core/lib/utils/utils.dart @@ -11,3 +11,4 @@ export 'network/network.dart'; export 'parser.dart'; export 'route_utils.dart'; export 'separator_input_formatter.dart'; +export 'number_utils.dart'; diff --git a/pubspec.lock b/pubspec.lock index 74f7cb2..c9af987 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1390,6 +1390,14 @@ packages: description: flutter source: sdk version: "0.0.0" + smooth_page_indicator: + dependency: transitive + description: + name: smooth_page_indicator + sha256: b21ebb8bc39cf72d11c7cfd809162a48c3800668ced1c9da3aade13a32cf6c1c + url: "https://pub.dev" + source: hosted + version: "1.2.1" source_gen: dependency: transitive description: