feat:
1-fake location 2-bottom navigation 3-bottom sheet 4-lazy map loading
This commit is contained in:
1
.mason/bricks.json
Normal file
1
.mason/bricks.json
Normal file
@@ -0,0 +1 @@
|
||||
{"flutter_ddd_module":"D:/fl_project/rasadyar_app/flutter_ddd_module"}
|
||||
@@ -1,8 +1,4 @@
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="vuesax/outline/filter">
|
||||
<g id="filter">
|
||||
<path id="Vector" d="M10.9399 22.65C10.4599 22.65 9.9899 22.53 9.5499 22.29C8.6699 21.8 8.1399 20.91 8.1399 19.91V14.61C8.1399 14.11 7.8099 13.36 7.4999 12.98L3.7599 9.02001C3.1299 8.39001 2.6499 7.31001 2.6499 6.50001V4.20001C2.6499 2.60001 3.8599 1.35001 5.3999 1.35001H18.5999C20.1199 1.35001 21.3499 2.58001 21.3499 4.10001V6.30001C21.3499 7.35001 20.7199 8.54001 20.1299 9.13001L15.7999 12.96C15.3799 13.31 15.0499 14.08 15.0499 14.7V19C15.0499 19.89 14.4899 20.92 13.7899 21.34L12.4099 22.23C11.9599 22.51 11.4499 22.65 10.9399 22.65ZM5.3999 2.85001C4.6999 2.85001 4.1499 3.44001 4.1499 4.20001V6.50001C4.1499 6.87001 4.4499 7.59001 4.8299 7.97001L8.6399 11.98C9.1499 12.61 9.6499 13.66 9.6499 14.6V19.9C9.6499 20.55 10.0999 20.87 10.2899 20.97C10.7099 21.2 11.2199 21.2 11.6099 20.96L12.9999 20.07C13.2799 19.9 13.5599 19.36 13.5599 19V14.7C13.5599 13.63 14.0799 12.45 14.8299 11.82L19.1099 8.03001C19.4499 7.69001 19.8599 6.88001 19.8599 6.29001V4.10001C19.8599 3.41001 19.2999 2.85001 18.6099 2.85001H5.3999Z" fill="white"/>
|
||||
<path id="Vector_2" d="M6.00017 10.75C5.86017 10.75 5.73017 10.71 5.60017 10.64C5.25017 10.42 5.14017 9.94999 5.36017 9.59999L10.2902 1.69999C10.5102 1.34999 10.9702 1.23999 11.3202 1.45999C11.6702 1.67999 11.7802 2.13999 11.5602 2.48999L6.63017 10.39C6.49017 10.62 6.25017 10.75 6.00017 10.75Z" fill="white"/>
|
||||
</g>
|
||||
</g>
|
||||
<svg width="40" height="41" viewBox="0 0 40 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M34.3335 7.33333V11C34.3335 12.3333 33.5001 14 32.6668 14.8333L25.5001 21.1667C24.5001 22 23.8335 23.6667 23.8335 25V32.1667C23.8335 33.1667 23.1668 34.5 22.3335 35L20.0001 36.5C17.8335 37.8333 14.8335 36.3333 14.8335 33.6667V24.8333C14.8335 23.6667 14.1668 22.1667 13.5001 21.3333L12.7168 20.5167C12.2001 19.9667 12.1001 19.1333 12.5168 18.4833L21.0501 4.78333C21.3501 4.3 21.8835 4 22.4668 4H31.0001C32.8335 4 34.3335 5.5 34.3335 7.33333Z" fill="white"/>
|
||||
<path d="M17.2503 6.55L11.3337 16.0333C10.767 16.95 9.46699 17.0833 8.71699 16.3L7.16699 14.6667C6.33366 13.8333 5.66699 12.3333 5.66699 11.3333V7.5C5.66699 5.5 7.16699 4 9.00033 4H15.8337C17.1337 4 17.9337 5.43333 17.2503 6.55Z" fill="white"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 814 B |
6
assets/icons/map.svg
Normal file
6
assets/icons/map.svg
Normal file
@@ -0,0 +1,6 @@
|
||||
<svg width="40" height="41" viewBox="0 0 40 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M15.2497 12.9834C14.3163 12.9834 13.583 13.7334 13.583 14.6501C13.583 15.5667 14.333 16.3167 15.2497 16.3167C16.1663 16.3167 16.9163 15.5667 16.9163 14.6501C16.9163 13.7334 16.1663 12.9834 15.2497 12.9834Z" fill="white"/>
|
||||
<path d="M35.7663 8.89967C34.3663 5.64967 31.283 3.83301 26.983 3.83301H13.0163C7.66634 3.83301 3.33301 8.16634 3.33301 13.5163V27.483C3.33301 31.783 5.14967 34.8663 8.39967 36.2663C8.71634 36.3997 9.08301 36.3163 9.31634 36.083L35.583 9.81634C35.833 9.56634 35.9163 9.19968 35.7663 8.89967ZM17.5497 20.8997C16.8997 21.533 16.0497 21.833 15.1997 21.833C14.3497 21.833 13.4997 21.5163 12.8497 20.8997C11.1497 19.2997 9.28301 16.7497 9.99967 13.7163C10.633 10.9663 13.0663 9.73301 15.1997 9.73301C17.333 9.73301 19.7663 10.9663 20.3997 13.733C21.0997 16.7497 19.233 19.2997 17.5497 20.8997Z" fill="white"/>
|
||||
<path d="M32.4502 34.7169C32.8168 35.0835 32.7668 35.6835 32.3168 35.9335C30.8502 36.7502 29.0668 37.1669 26.9835 37.1669H13.0168C12.5335 37.1669 12.3335 36.6002 12.6668 36.2669L22.7335 26.2002C23.0668 25.8669 23.5835 25.8669 23.9168 26.2002L32.4502 34.7169Z" fill="white"/>
|
||||
<path d="M36.6669 13.5168V27.4835C36.6669 29.5668 36.2503 31.3668 35.4336 32.8168C35.1836 33.2668 34.5836 33.3001 34.2169 32.9502L25.6836 24.4168C25.3503 24.0835 25.3503 23.5668 25.6836 23.2335L35.7503 13.1668C36.1003 12.8335 36.6669 13.0335 36.6669 13.5168Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
4
assets/icons/profile_circle.svg
Normal file
4
assets/icons/profile_circle.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<svg width="40" height="41" viewBox="0 0 40 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M36.6663 20.4997C36.6663 11.3163 29.183 3.83301 19.9997 3.83301C10.8163 3.83301 3.33301 11.3163 3.33301 20.4997C3.33301 25.333 5.41634 29.683 8.71634 32.733C8.71634 32.7497 8.71634 32.7497 8.69967 32.7663C8.86634 32.933 9.06634 33.0663 9.23301 33.2163C9.33301 33.2997 9.41634 33.383 9.51634 33.4497C9.81634 33.6997 10.1497 33.933 10.4663 34.1663C10.583 34.2497 10.683 34.3163 10.7997 34.3997C11.1163 34.6163 11.4497 34.8163 11.7997 34.9997C11.9163 35.0663 12.0497 35.1497 12.1663 35.2163C12.4997 35.3997 12.8497 35.5663 13.2163 35.7163C13.3497 35.783 13.483 35.8497 13.6163 35.8997C13.983 36.0497 14.3497 36.183 14.7163 36.2997C14.8497 36.3497 14.983 36.3997 15.1163 36.433C15.5163 36.5497 15.9163 36.6497 16.3163 36.7497C16.433 36.783 16.5497 36.8163 16.683 36.833C17.1497 36.933 17.6163 36.9997 18.0997 37.0497C18.1663 37.0497 18.233 37.0663 18.2997 37.083C18.8663 37.133 19.433 37.1663 19.9997 37.1663C20.5663 37.1663 21.133 37.133 21.683 37.083C21.7497 37.083 21.8163 37.0663 21.883 37.0497C22.3663 36.9997 22.833 36.933 23.2997 36.833C23.4163 36.8163 23.533 36.7663 23.6663 36.7497C24.0663 36.6497 24.483 36.5663 24.8663 36.433C24.9997 36.383 25.133 36.333 25.2663 36.2997C25.633 36.1663 26.0163 36.0497 26.3663 35.8997C26.4997 35.8497 26.633 35.783 26.7663 35.7163C27.1163 35.5663 27.4663 35.3997 27.8163 35.2163C27.9497 35.1497 28.0663 35.0663 28.183 34.9997C28.5163 34.7997 28.8497 34.6163 29.183 34.3997C29.2997 34.333 29.3997 34.2497 29.5163 34.1663C29.8497 33.933 30.1663 33.6997 30.4663 33.4497C30.5663 33.3663 30.6497 33.283 30.7497 33.2163C30.933 33.0663 31.1163 32.9163 31.283 32.7663C31.283 32.7497 31.283 32.7497 31.2663 32.733C34.583 29.683 36.6663 25.333 36.6663 20.4997ZM28.233 28.783C23.7163 25.7497 16.3163 25.7497 11.7663 28.783C11.033 29.2663 10.433 29.833 9.93301 30.4497C7.39967 27.883 5.83301 24.3663 5.83301 20.4997C5.83301 12.683 12.183 6.33301 19.9997 6.33301C27.8163 6.33301 34.1663 12.683 34.1663 20.4997C34.1663 24.3663 32.5997 27.883 30.0663 30.4497C29.583 29.833 28.9663 29.2663 28.233 28.783Z" fill="white"/>
|
||||
<path d="M20 12.0498C16.55 12.0498 13.75 14.8498 13.75 18.2998C13.75 21.6831 16.4 24.4331 19.9167 24.5331C19.9667 24.5331 20.0333 24.5331 20.0667 24.5331C20.1 24.5331 20.15 24.5331 20.1833 24.5331C20.2 24.5331 20.2167 24.5331 20.2167 24.5331C23.5833 24.4165 26.2333 21.6831 26.25 18.2998C26.25 14.8498 23.45 12.0498 20 12.0498Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
3
assets/icons/setting.svg
Normal file
3
assets/icons/setting.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
<svg width="40" height="41" viewBox="0 0 40 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M33.4997 15.8667C30.483 15.8667 29.2497 13.7334 30.7497 11.1167C31.6163 9.60006 31.0997 7.66672 29.583 6.80006L26.6997 5.15006C25.383 4.36672 23.683 4.83339 22.8997 6.15006L22.7163 6.46672C21.2163 9.08339 18.7497 9.08339 17.233 6.46672L17.0497 6.15006C16.2997 4.83339 14.5997 4.36672 13.283 5.15006L10.3997 6.80006C8.88301 7.66672 8.36634 9.61672 9.23301 11.1334C10.7497 13.7334 9.51634 15.8667 6.49967 15.8667C4.76634 15.8667 3.33301 17.2834 3.33301 19.0334V21.9667C3.33301 23.7001 4.74967 25.1334 6.49967 25.1334C9.51634 25.1334 10.7497 27.2667 9.23301 29.8834C8.36634 31.4001 8.88301 33.3334 10.3997 34.2001L13.283 35.8501C14.5997 36.6334 16.2997 36.1667 17.083 34.8501L17.2663 34.5334C18.7663 31.9167 21.233 31.9167 22.7497 34.5334L22.933 34.8501C23.7163 36.1667 25.4163 36.6334 26.733 35.8501L29.6163 34.2001C31.133 33.3334 31.6497 31.3834 30.783 29.8834C29.2663 27.2667 30.4997 25.1334 33.5163 25.1334C35.2497 25.1334 36.683 23.7167 36.683 21.9667V19.0334C36.6663 17.3001 35.2497 15.8667 33.4997 15.8667ZM19.9997 25.9167C17.0163 25.9167 14.583 23.4834 14.583 20.5001C14.583 17.5167 17.0163 15.0834 19.9997 15.0834C22.983 15.0834 25.4163 17.5167 25.4163 20.5001C25.4163 23.4834 22.983 25.9167 19.9997 25.9167Z" fill="white"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -1 +0,0 @@
|
||||
<svg id="Layer_1" enable-background="new 0 0 100 100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-.051" x2="91.965" y1="-4.851" y2="95.99"><stop offset="0" stop-color="#97e0ff"/><stop offset="1" stop-color="#1075ff"/></linearGradient><path d="m50 2.5000012c-26.2000008 0-47.5 21.2999973-47.5 47.5s21.2999992 47.4999988 47.5 47.4999988 47.5-21.3000031 47.5-47.5-21.3000031-47.4999988-47.5-47.4999988zm0 28.1999996c8.2000008 0 14.9000015 6.7000008 14.9000015 14.8999977s-6.7000007 14.9000015-14.9000015 14.9000015-14.9000015-6.7000008-14.9000015-14.9000015 6.7000007-14.8999977 14.9000015-14.8999977zm-26 48.1000023v-2.1999969c0-6.3000031 5.1000004-11.5 11.5-11.5h29c6.3000031 0 11.5 5.0999985 11.5 11.5v2.1999969c-6.9000015 6.1999969-16 10-26 10s-19.1000004-3.8000031-26-10z" fill="url(#SVGID_1_)"/></svg>
|
||||
|
Before Width: | Height: | Size: 926 B |
Binary file not shown.
BIN
assets/vec/map.svg.vec
Normal file
BIN
assets/vec/map.svg.vec
Normal file
Binary file not shown.
BIN
assets/vec/map_marker.svg.vec
Normal file
BIN
assets/vec/map_marker.svg.vec
Normal file
Binary file not shown.
BIN
assets/vec/profile_circle.svg.vec
Normal file
BIN
assets/vec/profile_circle.svg.vec
Normal file
Binary file not shown.
BIN
assets/vec/setting.svg.vec
Normal file
BIN
assets/vec/setting.svg.vec
Normal file
Binary file not shown.
96
features/supervision/lib/presentation/filter/logic.dart
Normal file
96
features/supervision/lib/presentation/filter/logic.dart
Normal file
@@ -0,0 +1,96 @@
|
||||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:latlong2/latlong.dart';
|
||||
import 'package:supervision/data/utils/marker_generator.dart';
|
||||
|
||||
class SupervisionFilterLogic extends GetxController {
|
||||
Rx<LatLng> currentLocation = LatLng(35.824891, 50.948025).obs;
|
||||
RxList<LatLng> allMarkers = <LatLng>[].obs;
|
||||
RxList<LatLng> markers = <LatLng>[].obs;
|
||||
Timer? _debounceTimer;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
RxBool isSelected = false.obs;
|
||||
|
||||
Future<void> determineCurrentPosition() async {
|
||||
bool serviceEnabled;
|
||||
LocationPermission permission;
|
||||
|
||||
serviceEnabled = await Geolocator.isLocationServiceEnabled();
|
||||
if (!serviceEnabled) {
|
||||
return Future.error('Location services are disabled.');
|
||||
}
|
||||
|
||||
permission = await Geolocator.checkPermission();
|
||||
if (permission == LocationPermission.denied) {
|
||||
permission = await Geolocator.requestPermission();
|
||||
if (permission == LocationPermission.denied) {
|
||||
return Future.error('Location permissions are denied.');
|
||||
}
|
||||
}
|
||||
|
||||
if (permission == LocationPermission.deniedForever) {
|
||||
return Future.error('Location permissions are permanently denied.');
|
||||
}
|
||||
|
||||
final position = await Geolocator.getCurrentPosition(
|
||||
locationSettings: AndroidSettings(accuracy: LocationAccuracy.best),
|
||||
);
|
||||
final latLng = LatLng(position.latitude, position.longitude);
|
||||
currentLocation.value = latLng;
|
||||
markers.add(latLng);
|
||||
}
|
||||
|
||||
void debouncedUpdateVisibleMarkers({required LatLng center}) {
|
||||
_debounceTimer?.cancel();
|
||||
_debounceTimer = Timer(const Duration(milliseconds: 300), () {
|
||||
final filtered = filterNearbyMarkers({
|
||||
'markers': allMarkers,
|
||||
'centerLat': center.latitude,
|
||||
'centerLng': center.longitude,
|
||||
'radius': 2000.0,
|
||||
});
|
||||
|
||||
markers.addAll(filtered);
|
||||
});
|
||||
}
|
||||
|
||||
List<LatLng> filterNearbyMarkers(Map<String, dynamic> args) {
|
||||
final List<LatLng> rawMarkers = args['markers'];
|
||||
final double centerLat = args['centerLat'];
|
||||
final double centerLng = args['centerLng'];
|
||||
final double radiusInMeters = args['radius'];
|
||||
final center = LatLng(centerLat, centerLng);
|
||||
final distance = Distance();
|
||||
|
||||
return rawMarkers
|
||||
.where((marker) => distance(center, marker) <= radiusInMeters)
|
||||
.toList();
|
||||
}
|
||||
|
||||
Future<void> generatedMarkers() async {
|
||||
final generatedMarkers = await generateLocationsUsingCompute(100000);
|
||||
allMarkers.value = generatedMarkers;
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
|
||||
determineCurrentPosition();
|
||||
generatedMarkers();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
// TODO: implement onClose
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
174
features/supervision/lib/presentation/filter/view.dart
Normal file
174
features/supervision/lib/presentation/filter/view.dart
Normal file
@@ -0,0 +1,174 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_map/flutter_map.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
import 'package:rasadyar_core/presentation/widget/buttons/fab.dart';
|
||||
|
||||
import 'logic.dart';
|
||||
|
||||
class SupervisionFilterPage extends GetView<SupervisionFilterLogic> {
|
||||
SupervisionFilterPage({super.key});
|
||||
|
||||
final Map styleTypes = <String, String>{
|
||||
'satellite': 's',
|
||||
'satelliteWithLabel': 'y',
|
||||
'street': 'p',
|
||||
'streetWithTraffic': 'p,traffic',
|
||||
};
|
||||
|
||||
final String token =
|
||||
"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjJlMGQyZTUyYzU1ZDJmMDkxNzBmNTdmM2JmOGVkODgxOTg5YTQxN2E5M2JiNDRiZTk1YzEyMjI1NzRlYWM3ZGYwOTlkNzhkNDUyMDRlMDJiIn0.eyJhdWQiOiIyODYyMiIsImp0aSI6IjJlMGQyZTUyYzU1ZDJmMDkxNzBmNTdmM2JmOGVkODgxOTg5YTQxN2E5M2JiNDRiZTk1YzEyMjI1NzRlYWM3ZGYwOTlkNzhkNDUyMDRlMDJiIiwiaWF0IjoxNzI1MTc2MDI5LCJuYmYiOjE3MjUxNzYwMjksImV4cCI6MTcyNzc2ODAyOSwic3ViIjoiIiwic2NvcGVzIjpbImJhc2ljIl19.bYQSwq48FZ9IM-Y7aTQAblEmIAz1b4m3nOWuKg-VTalx-eZqcIlzIOJI7XarBeS35CGvPbu6W9tAFoliz_HPARSMJM_Ni0YwESjscVqvPNJqV2vZlmgMj_wRDa0W5FmBipZ-AzKGcsuoMEpD8WzUgnlrhUdqVob1UHXQmZt1BFJlFHLm_grzKFf1_Lw_cHA_mRhhe36d_hU5Qg0jY3NP2NXG_TmecQcqch4YEwCh5_R_dUyMIlt70FL2OJ37ESyPYl-XMg3qOOjgI5YD8h6rciSfFsQpnOgl84HhV3aQ4MvWrIPl9ekEnwLM71He8o5KY1hhSQdOHSvO4yL6MBg9Yw";
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Stack(
|
||||
children: [
|
||||
ObxValue((currentLocation) {
|
||||
return FlutterMap(
|
||||
options: MapOptions(
|
||||
initialCenter: currentLocation.value,
|
||||
initialZoom: 18,
|
||||
onPositionChanged: (camera, hasGesture) {
|
||||
controller.debouncedUpdateVisibleMarkers(center: camera.center);
|
||||
},
|
||||
),
|
||||
children: [
|
||||
TileLayer(
|
||||
urlTemplate:
|
||||
"https://map.ir/shiveh/xyz/1.0.0/Shiveh:Shiveh@EPSG:3857@png/{z}/{x}/{y}.png"
|
||||
"?x-api-key=$token",
|
||||
),
|
||||
|
||||
ObxValue((markers) {
|
||||
return MarkerLayer(
|
||||
markers:
|
||||
markers
|
||||
.map(
|
||||
(marker) => Marker(
|
||||
point: marker,
|
||||
child: const Icon(
|
||||
Icons.location_on,
|
||||
color: Colors.red,
|
||||
size: 30,
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
);
|
||||
}, controller.markers),
|
||||
],
|
||||
);
|
||||
}, controller.currentLocation),
|
||||
|
||||
Positioned(
|
||||
right: 10,
|
||||
bottom: 100,
|
||||
child: RFab.smallAdd(
|
||||
onPressed: () {
|
||||
controller.isSelected.value = !controller.isSelected.value;
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
Positioned(
|
||||
bottom: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
child: ObxValue((isSelected) {
|
||||
return DraggableBottomSheet(isVisible: isSelected.value);
|
||||
}, controller.isSelected),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class DraggableBottomSheet extends StatefulWidget {
|
||||
final bool isVisible;
|
||||
final double initialHeight;
|
||||
final double minHeight;
|
||||
final double maxHeight;
|
||||
|
||||
const DraggableBottomSheet({
|
||||
super.key,
|
||||
required this.isVisible,
|
||||
this.initialHeight = 200,
|
||||
this.minHeight = 0,
|
||||
this.maxHeight = 700,
|
||||
});
|
||||
|
||||
@override
|
||||
State<DraggableBottomSheet> createState() => _DraggableBottomSheetState();
|
||||
}
|
||||
|
||||
class _DraggableBottomSheetState extends State<DraggableBottomSheet> {
|
||||
late double _sheetHeight;
|
||||
bool isWidgetVisible = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_sheetHeight = widget.initialHeight;
|
||||
isWidgetVisible = widget.isVisible;
|
||||
}
|
||||
|
||||
void _onVerticalDragUpdate(DragUpdateDetails details) {
|
||||
setState(() {
|
||||
_sheetHeight -= details.delta.dy;
|
||||
_sheetHeight = _sheetHeight.clamp(widget.minHeight, widget.maxHeight);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant DraggableBottomSheet oldWidget) {
|
||||
if (_sheetHeight <= oldWidget.initialHeight) {
|
||||
setState(() {
|
||||
isWidgetVisible = !isWidgetVisible;
|
||||
});
|
||||
}
|
||||
|
||||
super.didUpdateWidget(oldWidget);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AnimatedPositioned(
|
||||
duration: const Duration(milliseconds: 300),
|
||||
curve: Curves.easeOut,
|
||||
bottom: widget.isVisible ? 0 : -widget.maxHeight,
|
||||
left: 0,
|
||||
right: 0,
|
||||
child: GestureDetector(
|
||||
onVerticalDragUpdate: _onVerticalDragUpdate,
|
||||
child: Container(
|
||||
height: _sheetHeight,
|
||||
decoration: const BoxDecoration(
|
||||
color: Colors.white,
|
||||
borderRadius: BorderRadius.vertical(top: Radius.circular(50)),
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
const SizedBox(height: 10),
|
||||
Container(
|
||||
width: 40,
|
||||
height: 5,
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.grey[400],
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 10),
|
||||
Expanded(
|
||||
child: ListView.builder(
|
||||
itemCount: 15,
|
||||
itemBuilder:
|
||||
(context, index) =>
|
||||
ListTile(title: Text('Item ${index + 1}')),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
28
features/supervision/lib/presentation/root/logic.dart
Normal file
28
features/supervision/lib/presentation/root/logic.dart
Normal file
@@ -0,0 +1,28 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:supervision/presentation/filter/view.dart';
|
||||
|
||||
class RootLogic extends GetxController {
|
||||
RxInt currentIndex = 0.obs;
|
||||
List<Widget> pages = [
|
||||
SupervisionFilterPage(),
|
||||
Placeholder(color: Colors.red),
|
||||
Placeholder(color: Colors.amber),
|
||||
];
|
||||
|
||||
@override
|
||||
void onReady() {
|
||||
// TODO: implement onReady
|
||||
super.onReady();
|
||||
}
|
||||
|
||||
void changePage(int index) {
|
||||
currentIndex.value = index;
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
// TODO: implement onClose
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
62
features/supervision/lib/presentation/root/view.dart
Normal file
62
features/supervision/lib/presentation/root/view.dart
Normal file
@@ -0,0 +1,62 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
import 'logic.dart';
|
||||
|
||||
class RootPage extends GetView<RootLogic> {
|
||||
const RootPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Stack(
|
||||
children: [
|
||||
ObxValue(
|
||||
(currentIndex) => IndexedStack(
|
||||
index: currentIndex.value,
|
||||
children: controller.pages,
|
||||
),
|
||||
controller.currentIndex,
|
||||
),
|
||||
|
||||
Positioned(
|
||||
bottom: 0,
|
||||
left: 0,
|
||||
right: 0,
|
||||
child: ObxValue(
|
||||
(index) => BottomNavigation1(
|
||||
items: [
|
||||
BottomNavigation1Item(
|
||||
icon: Assets.vecMapSvg,
|
||||
label: 'نقشه',
|
||||
isSelected: controller.currentIndex.value == 0,
|
||||
onTap: () {
|
||||
controller.changePage(0);
|
||||
},
|
||||
),
|
||||
BottomNavigation1Item(
|
||||
icon: Assets.vecSettingSvg,
|
||||
label: 'اقدام',
|
||||
isSelected: controller.currentIndex.value == 1,
|
||||
onTap: () {
|
||||
controller.changePage(1);
|
||||
},
|
||||
),
|
||||
BottomNavigation1Item(
|
||||
icon: Assets.vecProfileCircleSvg,
|
||||
label: 'پروفایل',
|
||||
isSelected: controller.currentIndex.value == 2,
|
||||
onTap: () {
|
||||
controller.changePage(2);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
controller.currentIndex,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
import 'package:supervision/presentation/filter/logic.dart';
|
||||
import 'package:supervision/presentation/filter/view.dart';
|
||||
import 'package:supervision/presentation/root/logic.dart';
|
||||
import 'package:supervision/presentation/root/view.dart';
|
||||
import 'package:supervision/presentation/routes/app_routes.dart';
|
||||
|
||||
sealed class SupervisionPages {
|
||||
@@ -9,8 +10,11 @@ sealed class SupervisionPages {
|
||||
static final pages = [
|
||||
GetPage(
|
||||
name: SupervisionRoutes.supervision,
|
||||
page: () => SupervisionFilterPage(),
|
||||
binding: BindingsBuilder.put(() => SupervisionLogic()),
|
||||
page: () => RootPage(),
|
||||
bindings: [
|
||||
BindingsBuilder.put(() => RootLogic()),
|
||||
BindingsBuilder.put(() => SupervisionFilterLogic()),
|
||||
],
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
612
features/supervision/pubspec.lock
Normal file
612
features/supervision/pubspec.lock
Normal file
@@ -0,0 +1,612 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.7.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.13.0"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.19.1"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
cupertino_icons:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cupertino_icons
|
||||
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.8"
|
||||
dart_earcut:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_earcut
|
||||
sha256: e485001bfc05dcbc437d7bfb666316182e3522d4c3f9668048e004d0eb2ce43b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
dartx:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dartx
|
||||
sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_map:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_map
|
||||
sha256: f7d0379477274f323c3f3bc12d369a2b42eb86d1e7bd2970ae1ea3cff782449a
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.1.1"
|
||||
flutter_svg:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.17"
|
||||
flutter_web_plugins:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
freezed_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: freezed_annotation
|
||||
sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
geolocator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: geolocator
|
||||
sha256: f62bcd90459e63210bbf9c35deb6a51c521f992a78de19a1fe5c11704f9530e2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "13.0.4"
|
||||
geolocator_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_android
|
||||
sha256: fcb1760a50d7500deca37c9a666785c047139b5f9ee15aa5469fae7dbbe3170d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.6.2"
|
||||
geolocator_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_apple
|
||||
sha256: dbdd8789d5aaf14cf69f74d4925ad1336b4433a6efdf2fce91e8955dc921bf22
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.13"
|
||||
geolocator_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_platform_interface
|
||||
sha256: "30cb64f0b9adcc0fb36f628b4ebf4f731a2961a0ebd849f4b56200205056fe67"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.2.6"
|
||||
geolocator_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_web
|
||||
sha256: b1ae9bdfd90f861fde8fd4f209c37b953d65e92823cb73c7dee1fa021b06f172
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.3"
|
||||
geolocator_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: geolocator_windows
|
||||
sha256: "175435404d20278ffd220de83c2ca293b73db95eafbdc8131fe8609be1421eb6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.5"
|
||||
get:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: get
|
||||
sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.7.2"
|
||||
get_it:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: get_it
|
||||
sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.3"
|
||||
hive_ce:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: hive_ce
|
||||
sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.1"
|
||||
hive_ce_flutter:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: hive_ce_flutter
|
||||
sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
http:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http
|
||||
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.2"
|
||||
intl:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: intl
|
||||
sha256: "3df61194eb431efc39c4ceba583b95633a403f46c9fd341e550ce0bfa50e9aa5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.20.2"
|
||||
json_annotation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: json_annotation
|
||||
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.9.0"
|
||||
latlong2:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: latlong2
|
||||
sha256: "98227922caf49e6056f91b6c56945ea1c7b166f28ffcd5fb8e72fc0b453cc8fe"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.9.1"
|
||||
lists:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lists
|
||||
sha256: "4ca5c19ae4350de036a7e996cdd1ee39c93ac0a2b840f4915459b7d0a7d4ab27"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
location:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: location
|
||||
sha256: c2c4304071ec860525d5c50d142410072f8620c1d9f74874811af2e804e1a9c8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
location_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: location_platform_interface
|
||||
sha256: a3404ea6d74e89b121630be62ed8edcc7b39fd108bd19805d0ae55c397135dd7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
location_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: location_web
|
||||
sha256: "744bdff53dc455a2dc9a34474c49cde364d4fbef2aee009f8b0b4b68570c27a1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.0"
|
||||
logger:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logger
|
||||
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.11.1"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.16.0"
|
||||
mgrs_dart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mgrs_dart
|
||||
sha256: fb89ae62f05fa0bb90f70c31fc870bcbcfd516c843fb554452ab3396f78586f7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
path_parsing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_parsing
|
||||
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
path_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.16"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
permission_handler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler
|
||||
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.4.0"
|
||||
permission_handler_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "12.1.0"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_apple
|
||||
sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.4.6"
|
||||
permission_handler_html:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_html
|
||||
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3+5"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_platform_interface
|
||||
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.3.0"
|
||||
permission_handler_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_windows
|
||||
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.0"
|
||||
platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.6"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.8"
|
||||
polylabel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: polylabel
|
||||
sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
proj4dart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: proj4dart
|
||||
sha256: c8a659ac9b6864aa47c171e78d41bbe6f5e1d7bd790a5814249e6b68bc44324e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
rasadyar_core:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "../../packages/core"
|
||||
relative: true
|
||||
source: path
|
||||
version: "1.0.0+1"
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: rxdart
|
||||
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.28.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.1"
|
||||
sprintf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sprintf
|
||||
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
time:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: time
|
||||
sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
unicode:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: unicode
|
||||
sha256: "0f69e46593d65245774d4f17125c6084d2c20b4e473a983f6e21b7d7762218f1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.1"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: uuid
|
||||
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.1"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics
|
||||
sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.18"
|
||||
vector_graphics_codec:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_codec
|
||||
sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.13"
|
||||
vector_graphics_compiler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_compiler
|
||||
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.16"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web
|
||||
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
wkt_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wkt_parser
|
||||
sha256: "8a555fc60de3116c00aad67891bcab20f81a958e4219cc106e3c037aa3937f13"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xml
|
||||
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.5.0"
|
||||
sdks:
|
||||
dart: ">=3.7.0 <4.0.0"
|
||||
flutter: ">=3.27.0"
|
||||
@@ -1,3 +0,0 @@
|
||||
# 0.1.0+1
|
||||
|
||||
- TODO: Describe initial release.
|
||||
@@ -1 +0,0 @@
|
||||
Hello moji
|
||||
@@ -1 +0,0 @@
|
||||
TODO: Add your license here.
|
||||
@@ -1,27 +0,0 @@
|
||||
# flutter_ddd_module
|
||||
|
||||
[](https://github.com/felangel/mason)
|
||||
|
||||
A new brick created with the Mason CLI.
|
||||
|
||||
_Generated by [mason][1] 🧱_
|
||||
|
||||
## Getting Started 🚀
|
||||
|
||||
This is a starting point for a new brick.
|
||||
A few resources to get you started if this is your first brick template:
|
||||
|
||||
- [Official Mason Documentation][2]
|
||||
- [Code generation with Mason Blog][3]
|
||||
- [Very Good Livestream: Felix Angelov Demos Mason][4]
|
||||
- [Flutter Package of the Week: Mason][5]
|
||||
- [Observable Flutter: Building a Mason brick][6]
|
||||
- [Meet Mason: Flutter Vikings 2022][7]
|
||||
|
||||
[1]: https://github.com/felangel/mason
|
||||
[2]: https://docs.brickhub.dev
|
||||
[3]: https://verygood.ventures/blog/code-generation-with-mason
|
||||
[4]: https://youtu.be/G4PTjA6tpTU
|
||||
[5]: https://youtu.be/qjA0JFiPMnQ
|
||||
[6]: https://youtu.be/o8B1EfcUisw
|
||||
[7]: https://youtu.be/LXhgiF5HiQg
|
||||
@@ -1 +0,0 @@
|
||||
Hello {{name}}!
|
||||
@@ -1,20 +0,0 @@
|
||||
name: {{feature_name}}
|
||||
description: {{feature_name}} feature module
|
||||
version: 0.0.1
|
||||
publish_to: 'none'
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
flutter: ">=3.10.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_lints: ^5.0.0
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
@@ -1,33 +0,0 @@
|
||||
name: flutter_ddd_module
|
||||
description: A new brick created with the Mason CLI.
|
||||
|
||||
# The following defines the brick repository url.
|
||||
# Uncomment and update the following line before publishing the brick.
|
||||
# repository: https://github.com/my_org/my_repo
|
||||
|
||||
# The following defines the version and build number for your brick.
|
||||
# A version number is three numbers separated by dots, like 1.2.34
|
||||
# followed by an optional build number (separated by a +).
|
||||
version: 0.1.0+1
|
||||
|
||||
# The following defines the environment for the current brick.
|
||||
# It includes the version of mason that the brick requires.
|
||||
environment:
|
||||
mason: ^0.1.1
|
||||
|
||||
# Variables specify dynamic values that your brick depends on.
|
||||
# Zero or more variables can be specified for a given brick.
|
||||
# Each variable has:
|
||||
# * a type (string, number, boolean, enum, array, or list)
|
||||
# * an optional short description
|
||||
# * an optional default value
|
||||
# * an optional list of default values (array only)
|
||||
# * an optional prompt phrase used when asking for the variable
|
||||
# * a list of values (enums only)
|
||||
# * an optional separator (list only)
|
||||
vars:
|
||||
name:
|
||||
type: string
|
||||
description: Your name
|
||||
default: Dash
|
||||
prompt: What is your name?
|
||||
@@ -1,20 +0,0 @@
|
||||
name:
|
||||
description: feature module
|
||||
version: 0.0.1
|
||||
publish_to: 'none'
|
||||
|
||||
environment:
|
||||
sdk: '>=3.0.0 <4.0.0'
|
||||
flutter: ">=3.10.0"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_lints: ^5.0.0
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
@@ -10,10 +10,12 @@ class Assets {
|
||||
static const String iconsEdit = 'assets/icons/edit.svg';
|
||||
static const String iconsFilter = 'assets/icons/filter.svg';
|
||||
static const String iconsKey = 'assets/icons/key.svg';
|
||||
static const String iconsMap = 'assets/icons/map.svg';
|
||||
static const String iconsMapMarker = 'assets/icons/map_marker.svg';
|
||||
static const String iconsProfileCircle = 'assets/icons/profile_circle.svg';
|
||||
static const String iconsScan = 'assets/icons/scan.svg';
|
||||
static const String iconsSetting = 'assets/icons/setting.svg';
|
||||
static const String iconsTrash = 'assets/icons/trash.svg';
|
||||
static const String iconsUser = 'assets/icons/user.svg';
|
||||
static const String imagesInnerSplash = 'assets/images/inner_splash.webp';
|
||||
static const String imagesOutterSplash = 'assets/images/outter_splash.webp';
|
||||
static const String vecAddSvg = 'assets/vec/add.svg.vec';
|
||||
@@ -24,7 +26,11 @@ class Assets {
|
||||
static const String vecEditSvg = 'assets/vec/edit.svg.vec';
|
||||
static const String vecFilterSvg = 'assets/vec/filter.svg.vec';
|
||||
static const String vecKeySvg = 'assets/vec/key.svg.vec';
|
||||
static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec';
|
||||
static const String vecMapSvg = 'assets/vec/map.svg.vec';
|
||||
static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec';
|
||||
static const String vecScanSvg = 'assets/vec/scan.svg.vec';
|
||||
static const String vecSettingSvg = 'assets/vec/setting.svg.vec';
|
||||
static const String vecTrashSvg = 'assets/vec/trash.svg.vec';
|
||||
|
||||
}
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
library ;
|
||||
library;
|
||||
|
||||
export 'package:get/get.dart';
|
||||
export 'package:rasadyar_core/presentation/common/common.dart';
|
||||
export 'package:rasadyar_core/presentation/utils/utils.dart';
|
||||
export 'package:rasadyar_core/presentation/widget/widget.dart';
|
||||
|
||||
|
||||
export 'package:get/get.dart';
|
||||
368
packages/core/lib/presentation/common/app_color.dart
Normal file
368
packages/core/lib/presentation/common/app_color.dart
Normal file
@@ -0,0 +1,368 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppColor {
|
||||
AppColor._();
|
||||
|
||||
//region --- Blue Colors ---
|
||||
static const Color blueLight = Color(
|
||||
0xFFeaefff,
|
||||
); // #eaefff rgb(234, 239, 255)
|
||||
static const Color blueLightHover = Color(
|
||||
0xFFe0e7ff,
|
||||
); // #e0e7ff rgb(224, 231, 255)
|
||||
static const Color blueLightActive = Color(
|
||||
0xFFbecdff,
|
||||
); // #becdff rgb(190, 205, 255)
|
||||
static const Color blueNormal = Color(0xFF2d5fff); // #2d5fff rgb(45, 95, 255)
|
||||
static const Color blueNormalHover = Color(
|
||||
0xFF2956e6,
|
||||
); // #2956e6 rgb(41, 86, 230)
|
||||
static const Color blueNormalActive = Color(
|
||||
0xFF244ccc,
|
||||
); // #244ccc rgb(36, 76, 204)
|
||||
static const Color blueDark = Color(0xFF2247bf); // #2247bf rgb(34, 71, 191)
|
||||
static const Color blueDarkHover = Color(
|
||||
0xFF1b3999,
|
||||
); // #1b3999 rgb(27, 57, 153)
|
||||
static const Color blueDarkActive = Color(
|
||||
0xFF142b73,
|
||||
); // #142b73 rgb(20, 43, 115)
|
||||
static const Color blueDarker = Color(0xFF102159); // #102159 rgb(16, 33, 89)
|
||||
//endregion
|
||||
|
||||
//region --- Green Colors ---
|
||||
static const Color greenLight = Color(
|
||||
0xFFe6faf5,
|
||||
); // #e6faf5 rgb(230, 250, 245)
|
||||
static const Color greenLightHover = Color(
|
||||
0xFFd9f7f0,
|
||||
); // #d9f7f0 rgb(217, 247, 240)
|
||||
static const Color greenLightActive = Color(
|
||||
0xFFb0efdf,
|
||||
); // #b0efdf rgb(176, 239, 223)
|
||||
static const Color greenNormal = Color(
|
||||
0xFF00cc99,
|
||||
); // #00cc99 rgb(0, 204, 153)
|
||||
static const Color greenNormalHover = Color(
|
||||
0xFF00b88a,
|
||||
); // #00b88a rgb(0, 184, 138)
|
||||
static const Color greenNormalActive = Color(
|
||||
0xFF00a37a,
|
||||
); // #00a37a rgb(0, 163, 122)
|
||||
static const Color greenDark = Color(0xFF009973); // #009973 rgb(0, 153, 115)
|
||||
static const Color greenDarkHover = Color(
|
||||
0xFF007a5c,
|
||||
); // #007a5c rgb(0, 122, 92)
|
||||
static const Color greenDarkActive = Color(
|
||||
0xFF005c45,
|
||||
); // #005c45 rgb(0, 92, 69)
|
||||
static const Color greenDarker = Color(0xFF004736); // #004736 rgb(0, 71, 54)
|
||||
//endregion
|
||||
|
||||
//region --- Black Colors ---
|
||||
static const Color blackLight = Color(
|
||||
0xFFe6e6e6,
|
||||
); // #e6e6e6 rgb(230, 230, 230)
|
||||
static const Color blackLightHover = Color(
|
||||
0xFFd9d9d9,
|
||||
); // #d9d9d9 rgb(217, 217, 217)
|
||||
static const Color blackLightActive = Color(
|
||||
0xFFb0b0b0,
|
||||
); // #b0b0b0 rgb(176, 176, 176)
|
||||
static const Color blackNormal = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackNormalHover = Color(
|
||||
0xFF000000,
|
||||
); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackNormalActive = Color(
|
||||
0xFF000000,
|
||||
); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDark = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDarkHover = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDarkActive = Color(
|
||||
0xFF000000,
|
||||
); // #000000 rgb(0, 0, 0)
|
||||
static const Color blackDarker = Color(0xFF000000); // #000000 rgb(0, 0, 0)
|
||||
//endregion
|
||||
|
||||
//region ---Dark Grey Colors ---
|
||||
static const Color darkGreyLight = Color(
|
||||
0xFFeaeaea,
|
||||
); // #eaeaea rgb(234, 234, 234)
|
||||
static const Color darkGreyLightHover = Color(
|
||||
0xFFdfdfdf,
|
||||
); // #dfdfdf rgb(223, 223, 223)
|
||||
static const Color darkGreyLightActive = Color(
|
||||
0xFFbdbdbd,
|
||||
); // #bdbdbd rgb(189, 189, 189)
|
||||
static const Color darkGreyNormal = Color(
|
||||
0xFF2a2a2a,
|
||||
); // #2a2a2a rgb(42, 42, 42)
|
||||
static const Color darkGreyNormalHover = Color(
|
||||
0xFF262626,
|
||||
); // #262626 rgb(38, 38, 38)
|
||||
static const Color darkGreyNormalActive = Color(
|
||||
0xFF222222,
|
||||
); // #222222 rgb(34, 34, 34)
|
||||
static const Color darkGreyDark = Color(
|
||||
0xFF202020,
|
||||
); // #202020 rgb(32, 32, 32)
|
||||
static const Color darkGreyDarkHover = Color(
|
||||
0xFF191919,
|
||||
); // #191919 rgb(25, 25, 25)
|
||||
static const Color darkGreyDarkActive = Color(
|
||||
0xFF131313,
|
||||
); // #131313 rgb(19, 19, 19)
|
||||
static const Color darkGreyDarker = Color(
|
||||
0xFF0f0f0f,
|
||||
); // #0f0f0f rgb(15, 15, 15)
|
||||
//endregion
|
||||
|
||||
//region ---Medium Grey Colors ---
|
||||
static const Color mediumGreyLight = Color(
|
||||
0xFFf4f4f4,
|
||||
); // #f4f4f4 rgb(244, 244, 244)
|
||||
static const Color mediumGreyLightHover = Color(
|
||||
0xFFeeeeee,
|
||||
); // #eeeeee rgb(238, 238, 238)
|
||||
static const Color mediumGreyLightActive = Color(
|
||||
0xFFdcdcdc,
|
||||
); // #dcdcdc rgb(220, 220, 220)
|
||||
static const Color mediumGreyNormal = Color(
|
||||
0xFF8f8f8f,
|
||||
); // #8f8f8f rgb(143, 143, 143)
|
||||
static const Color mediumGreyNormalHover = Color(
|
||||
0xFF818181,
|
||||
); // #818181 rgb(129, 129, 129)
|
||||
static const Color mediumGreyNormalActive = Color(
|
||||
0xFF727272,
|
||||
); // #727272 rgb(114, 114, 114)
|
||||
static const Color mediumGreyDark = Color(
|
||||
0xFF6b6b6b,
|
||||
); // #6b6b6b rgb(107, 107, 107)
|
||||
static const Color mediumGreyDarkHover = Color(
|
||||
0xFF565656,
|
||||
); // #565656 rgb(86, 86, 86)
|
||||
static const Color mediumGreyDarkActive = Color(
|
||||
0xFF404040,
|
||||
); // #404040 rgb(64, 64, 64)
|
||||
static const Color mediumGreyDarker = Color(
|
||||
0xFF323232,
|
||||
); // #323232 rgb(50, 50, 50)
|
||||
//endregion
|
||||
|
||||
//region ---Light Grey Colors ---
|
||||
static const Color lightGreyLight = Color(
|
||||
0xFFfdfdfd,
|
||||
); // #fdfdfd rgb(253, 253, 253)
|
||||
static const Color lightGreyLightHover = Color(
|
||||
0xFFfcfcfc,
|
||||
); // #fcfcfc rgb(252, 252, 252)
|
||||
static const Color lightGreyLightActive = Color(
|
||||
0xFFfafafa,
|
||||
); // #fafafa rgb(250, 250, 250)
|
||||
static const Color lightGreyNormal = Color(
|
||||
0xFFeeeeee,
|
||||
); // #eeeeee rgb(238, 238, 238)
|
||||
static const Color lightGreyNormalHover = Color(
|
||||
0xFFd6d6d6,
|
||||
); // #d6d6d6 rgb(214, 214, 214)
|
||||
static const Color lightGreyNormalActive = Color(
|
||||
0xFFbebebe,
|
||||
); // #bebebe rgb(190, 190, 190)
|
||||
static const Color lightGreyDark = Color(
|
||||
0xFFb3b3b3,
|
||||
); // #b3b3b3 rgb(179, 179, 179)
|
||||
static const Color lightGreyDarkHover = Color(
|
||||
0xFF8f8f8f,
|
||||
); // #8f8f8f rgb(143, 143, 143)
|
||||
static const Color lightGreyDarkActive = Color(
|
||||
0xFF6b6b6b,
|
||||
); // #6b6b6b rgb(107, 107, 107)
|
||||
static const Color lightGreyDarker = Color(
|
||||
0xFF535353,
|
||||
); // #535353 rgb(83, 83, 83)
|
||||
//endregion
|
||||
|
||||
//region ---WhiteGrey Colors ---
|
||||
static const Color whiteGreyLight = Color(
|
||||
0xFFfefefe,
|
||||
); // #fefefe rgb(254, 254, 254)
|
||||
static const Color whiteGreyLightHover = Color(
|
||||
0xFFfefefe,
|
||||
); // #fefefe rgb(254, 254, 254)
|
||||
static const Color whiteGreyLightActive = Color(
|
||||
0xFFfdfdfd,
|
||||
); // #fdfdfd rgb(253, 253, 253)
|
||||
static const Color whiteGreyNormal = Color(
|
||||
0xFFf9f9f9,
|
||||
); // #f9f9f9 rgb(249, 249, 249)
|
||||
static const Color whiteGreyNormalHover = Color(
|
||||
0xFFe0e0e0,
|
||||
); // #e0e0e0 rgb(224, 224, 224)
|
||||
static const Color whiteGreyNormalActive = Color(
|
||||
0xFFc7c7c7,
|
||||
); // #c7c7c7 rgb(199, 199, 199)
|
||||
static const Color whiteGreyDark = Color(
|
||||
0xFFbbbbbb,
|
||||
); // #bbbbbb rgb(187, 187, 187)
|
||||
static const Color whiteGreyDarkHover = Color(
|
||||
0xFF959595,
|
||||
); // #959595 rgb(149, 149, 149)
|
||||
static const Color whiteGreyDarkActive = Color(
|
||||
0xFF707070,
|
||||
); // #707070 rgb(112, 112, 112)
|
||||
static const Color whiteGreyDarker = Color(
|
||||
0xFF575757,
|
||||
); // #575757 rgb(87, 87, 87)
|
||||
//endregion
|
||||
|
||||
//region ---White Colors ---
|
||||
static const Color whiteLight = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteLightHover = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteLightActive = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteNormal = Color(
|
||||
0xFFffffff,
|
||||
); // #ffffff rgb(255, 255, 255)
|
||||
static const Color whiteNormalHover = Color(
|
||||
0xFFe6e6e6,
|
||||
); // #e6e6e6 rgb(230, 230, 230)
|
||||
static const Color whiteNormalActive = Color(
|
||||
0xFFcccccc,
|
||||
); // #cccccc rgb(204, 204, 204)
|
||||
static const Color whiteDark = Color(
|
||||
0xFFbfbfbf,
|
||||
); // #bfbfbf rgb(191, 191, 191)
|
||||
static const Color whiteDarkHover = Color(
|
||||
0xFF999999,
|
||||
); // #999999 rgb(153, 153, 153)
|
||||
static const Color whiteDarkActive = Color(
|
||||
0xFF737373,
|
||||
); // #737373 rgb(115, 115, 115)
|
||||
static const Color whiteDarker = Color(0xFF595959); // #595959 rgb(89, 89, 89)
|
||||
//endregion
|
||||
|
||||
//region --- green1 Colors ---
|
||||
static const Color green1Light = Color(
|
||||
0xFFe6f6f4,
|
||||
); // #e6f6f4 rgb(230, 246, 244)
|
||||
static const Color green1LightHover = Color(
|
||||
0xFFd9f2ef,
|
||||
); // #d9f2ef rgb(217, 242, 239)
|
||||
static const Color green1LightActive = Color(
|
||||
0xFFb0e4dd,
|
||||
); // #b0e4dd rgb(176, 228, 221)
|
||||
static const Color green1Normal = Color(
|
||||
0xFF00a991,
|
||||
); // #00a991 rgb(0, 169, 145)
|
||||
static const Color green1NormalHover = Color(
|
||||
0xFF009883,
|
||||
); // #009883 rgb(0, 152, 131)
|
||||
static const Color green1NormalActive = Color(
|
||||
0xFF008774,
|
||||
); // #008774 rgb(0, 135, 116)
|
||||
static const Color green1Dark = Color(0xFF007f6d); // #007f6d rgb(0, 127, 109)
|
||||
static const Color green1DarkHover = Color(
|
||||
0xFF006557,
|
||||
); // #006557 rgb(0, 101, 87)
|
||||
static const Color green1DarkActive = Color(
|
||||
0xFF004c41,
|
||||
); // #004c41 rgb(0, 76, 65)
|
||||
static const Color green1Darker = Color(0xFF003b33); // #003b33 rgb(0, 59, 51)
|
||||
//endregion
|
||||
|
||||
//region --- Yellow Colors ---
|
||||
static const Color yellowLight = Color(
|
||||
0xFFfff9e6,
|
||||
); // #fff9e6 rgb(255, 249, 230)
|
||||
static const Color yellowLightHover = Color(
|
||||
0xFFfff6da,
|
||||
); // #fff6da rgb(255, 246, 218)
|
||||
static const Color yellowLightActive = Color(
|
||||
0xFFffecb2,
|
||||
); // #ffecb2 rgb(255, 236, 178)
|
||||
static const Color yellowNormal = Color(
|
||||
0xFFffc107,
|
||||
); // #ffc107 rgb(255, 193, 7)
|
||||
static const Color yellowNormalHover = Color(
|
||||
0xFFe6ae06,
|
||||
); // #e6ae06 rgb(230, 174, 6)
|
||||
static const Color yellowNormalActive = Color(
|
||||
0xFFcc9a06,
|
||||
); // #cc9a06 rgb(204, 154, 6)
|
||||
static const Color yellowDark = Color(0xFFbf9105); // #bf9105 rgb(191, 145, 5)
|
||||
static const Color yellowDarkHover = Color(
|
||||
0xFF997404,
|
||||
); // #997404 rgb(153, 116, 4)
|
||||
static const Color yellowDarkActive = Color(
|
||||
0xFF735703,
|
||||
); // #735703 rgb(115, 87, 3)
|
||||
static const Color yellowDarker = Color(0xFF594402); // #594402 rgb(89, 68, 2)
|
||||
//endregion
|
||||
|
||||
//region --- red Colors ---
|
||||
static const Color redLight = Color(0xFFfdeeee); // #fdeeee rgb(253, 238, 238)
|
||||
static const Color redLightHover = Color(
|
||||
0xFFfce6e6,
|
||||
); // #fce6e6 rgb(252, 230, 230)
|
||||
static const Color redLightActive = Color(
|
||||
0xFFf9cbcb,
|
||||
); // #f9cbcb rgb(249, 203, 203)
|
||||
static const Color redNormal = Color(0xFFeb5757); // #eb5757 rgb(235, 87, 87)
|
||||
static const Color redNormalHover = Color(
|
||||
0xFFd44e4e,
|
||||
); // #d44e4e rgb(212, 78, 78)
|
||||
static const Color redNormalActive = Color(
|
||||
0xFFbc4646,
|
||||
); // #bc4646 rgb(188, 70, 70)
|
||||
static const Color redDark = Color(0xFFb04141); // #b04141 rgb(176, 65, 65)
|
||||
static const Color redDarkHover = Color(
|
||||
0xFF8d3434,
|
||||
); // #8d3434 rgb(141, 52, 52)
|
||||
static const Color redDarkActive = Color(
|
||||
0xFF6a2727,
|
||||
); // #6a2727 rgb(106, 39, 39)
|
||||
static const Color redDarker = Color(0xFF521e1e); // #521e1e rgb(82, 30, 30)
|
||||
//endregion
|
||||
|
||||
//region --- Teal Colors ---
|
||||
static const Color tealLight = Color(
|
||||
0xFFe8f6f8,
|
||||
); // #e8f6f8 rgb(232, 246, 248)
|
||||
static const Color tealLightHover = Color(
|
||||
0xFFdcf1f4,
|
||||
); // #dcf1f4 rgb(220, 241, 244)
|
||||
static const Color tealLightActive = Color(
|
||||
0xFFb7e2e9,
|
||||
); // #b7e2e9 rgb(183, 226, 233)
|
||||
static const Color tealNormal = Color(
|
||||
0xFF17a2b8,
|
||||
); // #17a2b8 rgb(23, 162, 184)
|
||||
static const Color tealNormalHover = Color(
|
||||
0xFF1592a6,
|
||||
); // #1592a6 rgb(21, 146, 166)
|
||||
static const Color tealNormalActive = Color(
|
||||
0xFF128293,
|
||||
); // #128293 rgb(18, 130, 147)
|
||||
static const Color tealDark = Color(0xFF117a8a); // #117a8a rgb(17, 122, 138)
|
||||
static const Color tealDarkHover = Color(
|
||||
0xFF0e616e,
|
||||
); // #0e616e rgb(14, 97, 110)
|
||||
static const Color tealDarkActive = Color(
|
||||
0xFF0a4953,
|
||||
); // #0a4953 rgb(10, 73, 83)
|
||||
static const Color tealDarker = Color(0xFF083940); // #083940 rgb(8, 57, 64)
|
||||
//endregion
|
||||
|
||||
//region --- category Colors ---
|
||||
static const Color confirm = greenNormalActive;
|
||||
static const Color warning =yellowNormal;
|
||||
static const Color error =redNormal;
|
||||
static const Color info = tealNormal;
|
||||
//endregion
|
||||
}
|
||||
169
packages/core/lib/presentation/common/app_fonts.dart
Normal file
169
packages/core/lib/presentation/common/app_fonts.dart
Normal file
@@ -0,0 +1,169 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class AppFonts {
|
||||
AppFonts._(); // Private constructor to prevent instantiation
|
||||
|
||||
// --- Font Families ---
|
||||
static const String yekan = 'yekan';
|
||||
|
||||
// --- Font Weights ---
|
||||
static const FontWeight regular = FontWeight.w400;
|
||||
static const FontWeight bold = FontWeight.w600;
|
||||
static const double _height = 1.20;
|
||||
|
||||
static const TextStyle yekan61 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 61,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan49 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 48,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan39 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 39,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan31 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 31,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan25 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 25,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan24 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 24,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan20 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 20,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan18 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 18,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan16 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 16,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan14 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 13,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan13 = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 13,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan10 = TextStyle(
|
||||
// Rounded from 10.24
|
||||
fontFamily: yekan,
|
||||
fontWeight: regular,
|
||||
fontSize: 10,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan61Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 61,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan49Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 48,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan39Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 39,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan31Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 31,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan25Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 25,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan24Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 24,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan20Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 20,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan16Bold = TextStyle(
|
||||
// Base size bold
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 16,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan13Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 13,
|
||||
height: _height,
|
||||
);
|
||||
|
||||
static const TextStyle yekan10Bold = TextStyle(
|
||||
fontFamily: yekan,
|
||||
fontWeight: bold, // Use bold weight
|
||||
fontSize: 10,
|
||||
height: _height,
|
||||
);
|
||||
}
|
||||
36
packages/core/lib/presentation/common/assets.dart
Normal file
36
packages/core/lib/presentation/common/assets.dart
Normal file
@@ -0,0 +1,36 @@
|
||||
///This file is automatically generated. DO NOT EDIT, all your changes would be lost.
|
||||
class Assets {
|
||||
Assets._();
|
||||
|
||||
static const String iconsAdd = 'assets/icons/add.svg';
|
||||
static const String iconsArrowLeft = 'assets/icons/arrow_left.svg';
|
||||
static const String iconsArrowRight = 'assets/icons/arrow_right.svg';
|
||||
static const String iconsCall = 'assets/icons/call.svg';
|
||||
static const String iconsDownload = 'assets/icons/download.svg';
|
||||
static const String iconsEdit = 'assets/icons/edit.svg';
|
||||
static const String iconsFilter = 'assets/icons/filter.svg';
|
||||
static const String iconsKey = 'assets/icons/key.svg';
|
||||
static const String iconsMap = 'assets/icons/map.svg';
|
||||
static const String iconsMapMarker = 'assets/icons/map_marker.svg';
|
||||
static const String iconsProfileCircle = 'assets/icons/profile_circle.svg';
|
||||
static const String iconsScan = 'assets/icons/scan.svg';
|
||||
static const String iconsSetting = 'assets/icons/setting.svg';
|
||||
static const String iconsTrash = 'assets/icons/trash.svg';
|
||||
static const String imagesInnerSplash = 'assets/images/inner_splash.webp';
|
||||
static const String imagesOutterSplash = 'assets/images/outter_splash.webp';
|
||||
static const String vecAddSvg = 'assets/vec/add.svg.vec';
|
||||
static const String vecArrowLeftSvg = 'assets/vec/arrow_left.svg.vec';
|
||||
static const String vecArrowRightSvg = 'assets/vec/arrow_right.svg.vec';
|
||||
static const String vecCallSvg = 'assets/vec/call.svg.vec';
|
||||
static const String vecDownloadSvg = 'assets/vec/download.svg.vec';
|
||||
static const String vecEditSvg = 'assets/vec/edit.svg.vec';
|
||||
static const String vecFilterSvg = 'assets/vec/filter.svg.vec';
|
||||
static const String vecKeySvg = 'assets/vec/key.svg.vec';
|
||||
static const String vecMapMarkerSvg = 'assets/vec/map_marker.svg.vec';
|
||||
static const String vecMapSvg = 'assets/vec/map.svg.vec';
|
||||
static const String vecProfileCircleSvg = 'assets/vec/profile_circle.svg.vec';
|
||||
static const String vecScanSvg = 'assets/vec/scan.svg.vec';
|
||||
static const String vecSettingSvg = 'assets/vec/setting.svg.vec';
|
||||
static const String vecTrashSvg = 'assets/vec/trash.svg.vec';
|
||||
|
||||
}
|
||||
3
packages/core/lib/presentation/common/common.dart
Normal file
3
packages/core/lib/presentation/common/common.dart
Normal file
@@ -0,0 +1,3 @@
|
||||
export 'app_color.dart';
|
||||
export 'app_fonts.dart';
|
||||
export 'assets.dart';
|
||||
24
packages/core/lib/presentation/utils/color_utils.dart
Normal file
24
packages/core/lib/presentation/utils/color_utils.dart
Normal file
@@ -0,0 +1,24 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
extension ColorUtils on Color {
|
||||
Color _darken([double amount = 0.1]) {
|
||||
assert(amount >= 0 && amount <= 1, 'مقدار تیرگی باید بین 0 و 1 باشد');
|
||||
final hslColor = HSLColor.fromColor(this);
|
||||
final newLightness = (hslColor.lightness - amount).clamp(0.0, 1.0);
|
||||
final hslDarkerColor = hslColor.withLightness(newLightness);
|
||||
return hslDarkerColor.toColor();
|
||||
}
|
||||
|
||||
get disabledColor{
|
||||
return withAlpha(38);
|
||||
}
|
||||
|
||||
get hoverColor{
|
||||
return _darken(0.5);
|
||||
}
|
||||
|
||||
get pressedColor{
|
||||
return _darken(0.10);
|
||||
}
|
||||
|
||||
}
|
||||
1
packages/core/lib/presentation/utils/utils.dart
Normal file
1
packages/core/lib/presentation/utils/utils.dart
Normal file
@@ -0,0 +1 @@
|
||||
import 'color_utils.dart';
|
||||
@@ -0,0 +1,81 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/core.dart';
|
||||
|
||||
class BottomNavigation1 extends StatefulWidget {
|
||||
const BottomNavigation1({super.key, required this.items});
|
||||
|
||||
final List<BottomNavigation1Item> items;
|
||||
|
||||
@override
|
||||
State<BottomNavigation1> createState() => _BottomNavigation1State();
|
||||
}
|
||||
|
||||
class _BottomNavigation1State extends State<BottomNavigation1> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
height: 90,
|
||||
padding: EdgeInsets.fromLTRB(50, 10, 50, 10),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.blueNormal,
|
||||
borderRadius: const BorderRadius.only(
|
||||
topLeft: Radius.circular(50),
|
||||
topRight: Radius.circular(50),
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: widget.items,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class BottomNavigation1Item extends StatelessWidget {
|
||||
final String icon;
|
||||
final String label;
|
||||
final bool isSelected;
|
||||
final Function() onTap;
|
||||
|
||||
const BottomNavigation1Item({
|
||||
super.key,
|
||||
required this.icon,
|
||||
required this.label,
|
||||
required this.isSelected,
|
||||
required this.onTap,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
width: 80,
|
||||
height: 80,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: isSelected ? Colors.white.withAlpha(208) : Colors.transparent,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
),
|
||||
child: InkWell(
|
||||
onTap: onTap,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
vecWidget(
|
||||
icon,
|
||||
width: 32,
|
||||
height: 32,
|
||||
color: isSelected ? AppColor.blueNormal : Colors.white,
|
||||
),
|
||||
const SizedBox(height: 5),
|
||||
Text(
|
||||
label,
|
||||
style: AppFonts.yekan14.copyWith(
|
||||
color: isSelected ? AppColor.blueNormal : Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
56
packages/core/lib/presentation/widget/buttons/elevated.dart
Normal file
56
packages/core/lib/presentation/widget/buttons/elevated.dart
Normal file
@@ -0,0 +1,56 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
|
||||
class RElevated extends StatefulWidget {
|
||||
RElevated({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
foregroundColor,
|
||||
backgroundColor,
|
||||
disabledBackgroundColor,
|
||||
disabledForegroundColor,
|
||||
radius,
|
||||
textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
Color? disabledForegroundColor;
|
||||
Color? disabledBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
|
||||
@override
|
||||
State<RElevated> createState() => _RElevatedState();
|
||||
}
|
||||
|
||||
class _RElevatedState extends State<RElevated> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ElevatedButton(
|
||||
onPressed: widget.onPressed,
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: widget.backgroundColor ?? AppColor.blueNormal,
|
||||
foregroundColor: widget.foregroundColor ?? Colors.white,
|
||||
disabledBackgroundColor:
|
||||
widget.disabledBackgroundColor ?? AppColor.blueNormal.withAlpha(38),
|
||||
disabledForegroundColor: widget.disabledForegroundColor ?? Colors.white,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
fixedSize: Size(widget.width, widget.height),
|
||||
padding: EdgeInsets.zero,
|
||||
textStyle: widget.textStyle ?? AppFonts.yekan24,
|
||||
),
|
||||
child: Text(widget.text),
|
||||
);
|
||||
}
|
||||
}
|
||||
232
packages/core/lib/presentation/widget/buttons/fab.dart
Normal file
232
packages/core/lib/presentation/widget/buttons/fab.dart
Normal file
@@ -0,0 +1,232 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/assets.dart';
|
||||
import 'package:rasadyar_core/presentation/utils/color_utils.dart';
|
||||
import 'package:rasadyar_core/presentation/widget/vec_widget.dart';
|
||||
|
||||
class RFab extends StatefulWidget {
|
||||
|
||||
|
||||
final VoidCallback? onPressed;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
Color? disabledForegroundColor;
|
||||
Color? disabledBackgroundColor;
|
||||
double? radius;
|
||||
ShapeBorder? shapeBorder;
|
||||
Widget? icon;
|
||||
|
||||
@override
|
||||
State<RFab> createState() => _RFabState();
|
||||
|
||||
//region Add
|
||||
RFab.smallAdd({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecAddSvg),
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.add({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecAddSvg),
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Edit
|
||||
RFab.smallEdit({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecEditSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.edit({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecEditSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region delete
|
||||
RFab.smallDelete({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecTrashSvg),
|
||||
backgroundColor: AppColor.redNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.delete({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecTrashSvg),
|
||||
backgroundColor: AppColor.redNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region action
|
||||
RFab.smallAction({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecScanSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.action({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecScanSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region filter
|
||||
RFab.smallFilter({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecFilterSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.filter({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecFilterSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region download
|
||||
RFab.smallDownload({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.download({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Excel
|
||||
RFab.smallExcel({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.greenDark,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.excel({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecDownloadSvg),
|
||||
backgroundColor: AppColor.greenDark,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Back
|
||||
RFab.smallBack({required VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecArrowLeftSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
RFab.back({required VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
onPressed: onPressed,
|
||||
icon: vecWidget(Assets.vecArrowLeftSvg),
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
key: key,
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region General
|
||||
RFab.small({
|
||||
required this.onPressed,
|
||||
required this.icon,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : radius = 40.0,
|
||||
foregroundColor = Colors.white;
|
||||
|
||||
RFab({
|
||||
required this.onPressed,
|
||||
required this.icon,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : radius = 56.0,
|
||||
foregroundColor = Colors.white;
|
||||
|
||||
//endregion
|
||||
}
|
||||
|
||||
class _RFabState extends State<RFab> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ElevatedButton(
|
||||
onPressed: widget.onPressed,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.all(BorderSide.none),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return widget.backgroundColor?.pressedColor ??
|
||||
AppColor.blueNormalActive;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.hoverColor ??
|
||||
AppColor.blueNormalHover;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor?.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor;
|
||||
}
|
||||
return widget.backgroundColor ?? AppColor.blueNormal;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.disabled)) {
|
||||
return widget.foregroundColor?.disabledColor;
|
||||
}
|
||||
return widget.foregroundColor;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
CircleBorder(side: BorderSide(width: 1, color: Colors.transparent)),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(
|
||||
Size(widget.radius ?? 56, widget.radius ?? 56),
|
||||
),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
),
|
||||
child: widget.icon,
|
||||
);
|
||||
}
|
||||
}
|
||||
605
packages/core/lib/presentation/widget/buttons/fab_outlined.dart
Normal file
605
packages/core/lib/presentation/widget/buttons/fab_outlined.dart
Normal file
@@ -0,0 +1,605 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/assets.dart';
|
||||
import 'package:rasadyar_core/presentation/utils/color_utils.dart';
|
||||
import 'package:rasadyar_core/presentation/widget/vec_widget.dart';
|
||||
|
||||
class RFabOutlined extends StatefulWidget {
|
||||
final Widget icon;
|
||||
VoidCallback? onPressed;
|
||||
final Color backgroundColor;
|
||||
final Color? borderColor;
|
||||
final double? radius;
|
||||
OutlinedBorder? shapeBorder;
|
||||
|
||||
@override
|
||||
State<RFabOutlined> createState() => _RFabOutlinedState();
|
||||
|
||||
//region General
|
||||
RFabOutlined({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
required this.borderColor,
|
||||
this.radius = 56.0,
|
||||
super.key,
|
||||
}) : shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: borderColor ?? Colors.transparent),
|
||||
);
|
||||
|
||||
RFabOutlined.noBorder({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : borderColor = Colors.transparent,
|
||||
radius = 56.0,
|
||||
shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: Colors.transparent, width: 1),
|
||||
);
|
||||
|
||||
RFabOutlined.small({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
required this.borderColor,
|
||||
super.key,
|
||||
}) : radius = 40.0,
|
||||
shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: borderColor ?? Colors.transparent, width: 1),
|
||||
);
|
||||
|
||||
RFabOutlined.smallNoBorder({
|
||||
required this.icon,
|
||||
required this.onPressed,
|
||||
required this.backgroundColor,
|
||||
super.key,
|
||||
}) : borderColor = Colors.transparent,
|
||||
radius = 40.0,
|
||||
shapeBorder = CircleBorder(
|
||||
side: BorderSide(color: Colors.transparent, width: 1),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Add
|
||||
RFabOutlined.smallAdd({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
borderColor: AppColor.greenNormal,
|
||||
icon: vecWidget2(
|
||||
Assets.vecAddSvg,
|
||||
|
||||
color: AppColor.greenNormal,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallAddNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecAddSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenNormal
|
||||
: AppColor.greenNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.add({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
borderColor: AppColor.greenNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecAddSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenNormal
|
||||
: AppColor.greenNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.addNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecAddSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenNormal
|
||||
: AppColor.greenNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Edit
|
||||
RFabOutlined.smallEdit({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallEditNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.edit({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.editNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecEditSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Delete
|
||||
RFabOutlined.smallDelete({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
borderColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallDeleteNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.delete({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
borderColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.deleteNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.redNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecTrashSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.redNormal
|
||||
: AppColor.redNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Action
|
||||
RFabOutlined.smallAction({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallActionNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.action({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.actionNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecScanSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Filter
|
||||
RFabOutlined.smallFilter({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallFilterNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.filter({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.filterNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecFilterSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Download
|
||||
RFabOutlined.smallDownload({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallDownloadNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.download({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.downloadNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Excel
|
||||
RFabOutlined.smallExcel({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
borderColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallExcelNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.excel({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
borderColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.excelNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.greenDark,
|
||||
icon: vecWidget(
|
||||
Assets.vecDownloadSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.greenDark
|
||||
: AppColor.greenDark.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
|
||||
//region Back
|
||||
RFabOutlined.smallBack({VoidCallback? onPressed, Key? key})
|
||||
: this.small(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.smallBackNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.smallNoBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.back({VoidCallback? onPressed, Key? key})
|
||||
: this(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
borderColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
RFabOutlined.backNoBorder({VoidCallback? onPressed, Key? key})
|
||||
: this.noBorder(
|
||||
key: key,
|
||||
onPressed: onPressed,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
icon: vecWidget(
|
||||
Assets.vecArrowLeftSvg,
|
||||
color:
|
||||
onPressed != null
|
||||
? AppColor.blueNormal
|
||||
: AppColor.blueNormal.disabledColor,
|
||||
),
|
||||
);
|
||||
|
||||
//endregion
|
||||
}
|
||||
|
||||
class _RFabOutlinedState extends State<RFabOutlined> {
|
||||
bool isOnPressed =false;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return OutlinedButton(
|
||||
onPressed:widget.onPressed ,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.resolveWith<BorderSide?>((states) {
|
||||
if (states.contains(WidgetState.disabled)) {
|
||||
return BorderSide(
|
||||
color:
|
||||
widget.borderColor?.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor,
|
||||
width: 2,
|
||||
);
|
||||
}
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
}),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return widget.backgroundColor;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor.hoverColor ??
|
||||
AppColor.blueNormal.hoverColor;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor;
|
||||
}
|
||||
return Colors.transparent;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor.disabledColor ??
|
||||
AppColor.blueNormal.disabledColor;
|
||||
}
|
||||
return widget.backgroundColor;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(widget.shapeBorder),
|
||||
fixedSize: WidgetStatePropertyAll(
|
||||
Size(widget.radius ?? 56, widget.radius ?? 56),
|
||||
),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
),
|
||||
child: widget.icon
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
import 'package:rasadyar_core/presentation/utils/color_utils.dart';
|
||||
|
||||
class ROutlinedElevated extends StatefulWidget {
|
||||
ROutlinedElevated({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
this.foregroundColor,
|
||||
this.backgroundColor,
|
||||
this.borderColor,
|
||||
this.disabledBackgroundColor,
|
||||
this.pressedBackgroundColor,
|
||||
this.radius,
|
||||
this.textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
|
||||
Color? borderColor;
|
||||
|
||||
Color? disabledBackgroundColor;
|
||||
Color? pressedBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
|
||||
@override
|
||||
State<ROutlinedElevated> createState() => _ROutlinedElevatedState();
|
||||
}
|
||||
|
||||
class _ROutlinedElevatedState extends State<ROutlinedElevated> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return OutlinedButton(
|
||||
onPressed: widget.onPressed,
|
||||
style: ButtonStyle(
|
||||
side: WidgetStateProperty.resolveWith<BorderSide?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal.withAlpha(38),
|
||||
width: 2,
|
||||
);
|
||||
}
|
||||
return BorderSide(
|
||||
color: widget.borderColor ?? AppColor.blueNormal,
|
||||
width: 2,
|
||||
);
|
||||
}),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
if (widget.pressedBackgroundColor != null) {
|
||||
return widget.pressedBackgroundColor;
|
||||
}
|
||||
return widget.backgroundColor?.pressedColor ?? AppColor.blueNormal;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.hoverColor ??
|
||||
AppColor.blueNormal.hoverColor;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.backgroundColor?.disabledColor ?? Colors.transparent;
|
||||
}
|
||||
return widget.backgroundColor;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return AppColor.blueNormal.withAlpha(38);
|
||||
}
|
||||
return AppColor.blueNormal;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
textStyle: WidgetStatePropertyAll(
|
||||
widget.textStyle ??
|
||||
AppFonts.yekan24.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
child: Text(widget.text),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
|
||||
class RTextButton extends StatefulWidget {
|
||||
RTextButton({
|
||||
super.key,
|
||||
required this.text,
|
||||
required this.onPressed,
|
||||
this.foregroundColor,
|
||||
this.backgroundColor,
|
||||
this.borderColor,
|
||||
this.disabledBackgroundColor,
|
||||
this.radius,
|
||||
this.textStyle,
|
||||
this.width = 150.0,
|
||||
this.height = 56.0,
|
||||
});
|
||||
|
||||
final String text;
|
||||
final VoidCallback? onPressed;
|
||||
final double width;
|
||||
final double height;
|
||||
Color? foregroundColor;
|
||||
Color? backgroundColor;
|
||||
Color? borderColor;
|
||||
|
||||
Color? disabledBackgroundColor;
|
||||
double? radius;
|
||||
TextStyle? textStyle;
|
||||
|
||||
@override
|
||||
State<RTextButton> createState() => _RTextButtonState();
|
||||
}
|
||||
|
||||
class _RTextButtonState extends State<RTextButton> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return TextButton(
|
||||
style: ButtonStyle(
|
||||
side: WidgetStatePropertyAll(BorderSide.none),
|
||||
backgroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return widget.backgroundColor ?? AppColor.blueNormal;
|
||||
} else if (states.contains(WidgetState.hovered)) {
|
||||
return widget.backgroundColor?.withAlpha(38) ?? AppColor.blueNormal.withAlpha(38);
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return widget.disabledBackgroundColor ?? Colors.transparent;
|
||||
}
|
||||
return Colors.transparent;
|
||||
}),
|
||||
foregroundColor: WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
} else if (states.contains(WidgetState.disabled)) {
|
||||
return AppColor.blueNormal.withAlpha(38);
|
||||
}
|
||||
return AppColor.blueNormal;
|
||||
}),
|
||||
|
||||
shape: WidgetStatePropertyAll(
|
||||
RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(widget.radius ?? 8),
|
||||
),
|
||||
),
|
||||
fixedSize: WidgetStatePropertyAll(Size(widget.width, widget.height)),
|
||||
padding: WidgetStatePropertyAll(EdgeInsets.zero),
|
||||
textStyle: WidgetStatePropertyAll(
|
||||
widget.textStyle ??
|
||||
AppFonts.yekan24.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
onPressed:widget.onPressed,
|
||||
child: Text(widget.text),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,266 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
|
||||
class CaptchaController {
|
||||
int? captchaCode;
|
||||
TextEditingController textController = TextEditingController();
|
||||
GlobalKey<FormState> formKey = GlobalKey<FormState>();
|
||||
|
||||
late Function() refreshCaptcha;
|
||||
|
||||
bool validate() {
|
||||
if (formKey.currentState?.validate() == true) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
String get enteredText => textController.text;
|
||||
|
||||
bool isCorrect() {
|
||||
return textController.text == captchaCode.toString();
|
||||
}
|
||||
|
||||
void clear() {
|
||||
textController.clear();
|
||||
}
|
||||
}
|
||||
|
||||
class RandomLinePainter extends CustomPainter {
|
||||
final Random random = Random();
|
||||
final Paint linePaint;
|
||||
final List<Offset> points;
|
||||
|
||||
RandomLinePainter({
|
||||
required this.points,
|
||||
required Color lineColor,
|
||||
double strokeWidth = 2.0,
|
||||
}) : linePaint =
|
||||
Paint()
|
||||
..color = lineColor
|
||||
..strokeWidth = strokeWidth
|
||||
..strokeCap = StrokeCap.round
|
||||
..style = PaintingStyle.stroke;
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
final path = Path();
|
||||
|
||||
if (points.isNotEmpty) {
|
||||
path.moveTo(points[0].dx, points[0].dy);
|
||||
|
||||
for (int i = 1; i < points.length; i++) {
|
||||
path.lineTo(points[i].dx, points[i].dy);
|
||||
}
|
||||
|
||||
canvas.drawPath(path, linePaint);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
bool shouldRepaint(RandomLinePainter oldDelegate) => true;
|
||||
}
|
||||
|
||||
class CaptchaWidget extends StatefulWidget {
|
||||
final CaptchaController controller;
|
||||
final bool autoValidateMode;
|
||||
|
||||
const CaptchaWidget({
|
||||
required this.controller,
|
||||
this.autoValidateMode = false,
|
||||
super.key,
|
||||
});
|
||||
|
||||
@override
|
||||
_CaptchaWidgetState createState() => _CaptchaWidgetState();
|
||||
}
|
||||
|
||||
class _CaptchaWidgetState extends State<CaptchaWidget> {
|
||||
late List<Offset> points;
|
||||
late List<Offset> points1;
|
||||
late List<Offset> points2;
|
||||
bool isOnError = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
generateLines();
|
||||
getRandomSixDigitNumber();
|
||||
|
||||
// Set the refresh function in the controller
|
||||
widget.controller.refreshCaptcha = () {
|
||||
getRandomSixDigitNumber();
|
||||
generateLines();
|
||||
setState(() {});
|
||||
};
|
||||
}
|
||||
|
||||
void generateLines() {
|
||||
points = generateRandomLine();
|
||||
points1 = generateRandomLine();
|
||||
points2 = generateRandomLine();
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
List<Offset> generateRandomLine() {
|
||||
final random = Random();
|
||||
int pointCount = random.nextInt(10) + 5;
|
||||
List<Offset> points = [];
|
||||
|
||||
double previousY = 0;
|
||||
|
||||
for (int i = 0; i < pointCount; i++) {
|
||||
double x = (i / (pointCount - 1)) * 135;
|
||||
|
||||
if (i == 0) {
|
||||
previousY = 24;
|
||||
} else {
|
||||
double change = (random.nextDouble() * 20) - 10;
|
||||
previousY = max(5, min(43, previousY + change));
|
||||
}
|
||||
|
||||
points.add(Offset(x, previousY));
|
||||
}
|
||||
|
||||
return points;
|
||||
}
|
||||
|
||||
void getRandomSixDigitNumber() {
|
||||
final random = Random();
|
||||
widget.controller.captchaCode = random.nextInt(900000) + 100000;
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Container(
|
||||
width: 135,
|
||||
height: 48,
|
||||
decoration: BoxDecoration(
|
||||
color: AppColor.whiteNormalHover,
|
||||
border: Border.all(color: Colors.grey.shade300),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
child: Stack(
|
||||
alignment: AlignmentDirectional.center,
|
||||
children: [
|
||||
CustomPaint(
|
||||
painter: RandomLinePainter(
|
||||
points: points,
|
||||
lineColor: Colors.blue,
|
||||
strokeWidth: 1.0,
|
||||
),
|
||||
size: const Size(double.infinity, double.infinity),
|
||||
),
|
||||
CustomPaint(
|
||||
painter: RandomLinePainter(
|
||||
points: points1,
|
||||
lineColor: Colors.green,
|
||||
strokeWidth: 1.0,
|
||||
),
|
||||
size: const Size(double.infinity, double.infinity),
|
||||
),
|
||||
CustomPaint(
|
||||
painter: RandomLinePainter(
|
||||
points: points2,
|
||||
lineColor: Colors.red,
|
||||
strokeWidth: 1.0,
|
||||
),
|
||||
size: const Size(double.infinity, double.infinity),
|
||||
),
|
||||
Text(
|
||||
widget.controller.captchaCode.toString(),
|
||||
style: AppFonts.yekan24,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
onPressed: widget.controller.refreshCaptcha,
|
||||
icon: Icon(CupertinoIcons.refresh, size: 16),
|
||||
),
|
||||
Expanded(
|
||||
child: Form(
|
||||
key: widget.controller.formKey,
|
||||
autovalidateMode:
|
||||
widget.autoValidateMode
|
||||
? AutovalidateMode.onUserInteraction
|
||||
: AutovalidateMode.disabled,
|
||||
child: TextFormField(
|
||||
controller: widget.controller.textController,
|
||||
decoration: InputDecoration(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
gapPadding: 11,
|
||||
),
|
||||
labelText: 'کد امنیتی',
|
||||
labelStyle: AppFonts.yekan13,
|
||||
errorStyle: AppFonts.yekan10.copyWith(
|
||||
color: AppColor.redNormal,
|
||||
fontSize: 8,
|
||||
),
|
||||
suffixIconConstraints: BoxConstraints(
|
||||
maxHeight: 24,
|
||||
minHeight: 24,
|
||||
maxWidth: 24,
|
||||
minWidth: 24,
|
||||
),
|
||||
|
||||
suffix:
|
||||
widget.controller.textController.text.trim().isNotEmpty
|
||||
? clearButton(() {
|
||||
widget.controller.textController.clear();
|
||||
setState(() {});
|
||||
})
|
||||
: null,
|
||||
counterText: '',
|
||||
),
|
||||
keyboardType: TextInputType.numberWithOptions(
|
||||
decimal: false,
|
||||
signed: false,
|
||||
),
|
||||
maxLines: 1,
|
||||
maxLength: 6,
|
||||
onChanged: (value) {
|
||||
if (isOnError) {
|
||||
isOnError = !isOnError;
|
||||
widget.controller.formKey.currentState?.reset();
|
||||
widget.controller.textController.text = value;
|
||||
}
|
||||
setState(() {});
|
||||
},
|
||||
validator: (value) {
|
||||
if (value == null || value.isEmpty) {
|
||||
isOnError = true;
|
||||
return 'کد امنیتی را وارد کنید';
|
||||
}
|
||||
if (value != widget.controller.captchaCode.toString()) {
|
||||
isOnError = true;
|
||||
return '⚠️کد امنیتی وارد شده اشتباه است';
|
||||
}
|
||||
return null;
|
||||
},
|
||||
style: AppFonts.yekan13,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget clearButton(VoidCallback onTap) {
|
||||
return GestureDetector(
|
||||
onTap: onTap,
|
||||
child: Icon(CupertinoIcons.multiply_circle, size: 18),
|
||||
);
|
||||
}
|
||||
}
|
||||
216
packages/core/lib/presentation/widget/inputs/r_input.dart
Normal file
216
packages/core/lib/presentation/widget/inputs/r_input.dart
Normal file
@@ -0,0 +1,216 @@
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
@immutable
|
||||
class RTextField extends StatefulWidget {
|
||||
RTextField(
|
||||
{super.key,
|
||||
this.maxLines,
|
||||
this.maxLength,
|
||||
this.hintText,
|
||||
this.padding,
|
||||
this.onChanged,
|
||||
this.onSubmitted,
|
||||
this.keyboardType,
|
||||
this.showCounter = false,
|
||||
this.isDense,
|
||||
this.initText,
|
||||
this.isForNumber = false,
|
||||
this.style,
|
||||
this.hintStyle,
|
||||
this.suffixIcon,
|
||||
this.prefixIcon,
|
||||
this.validator,
|
||||
this.readonly = false,
|
||||
this.boxConstraints,
|
||||
this.minLines,
|
||||
this.radius,
|
||||
this.filled,
|
||||
this.enabled,
|
||||
this.errorStyle,
|
||||
this.labelStyle,
|
||||
this.label}) {
|
||||
filled = filled ?? false;
|
||||
obscure = false;
|
||||
_inputBorder = OutlineInputBorder(
|
||||
borderSide: BorderSide(color: Colors.grey.shade300),
|
||||
borderRadius: BorderRadius.circular(radius ?? 16));
|
||||
}
|
||||
|
||||
RTextField.noBorder(
|
||||
{super.key,
|
||||
this.maxLines,
|
||||
this.maxLength,
|
||||
this.hintText,
|
||||
this.padding,
|
||||
this.onChanged,
|
||||
this.onSubmitted,
|
||||
this.keyboardType,
|
||||
this.showCounter = false,
|
||||
this.isDense,
|
||||
this.initText,
|
||||
this.style,
|
||||
this.hintStyle,
|
||||
this.suffixIcon,
|
||||
this.radius,
|
||||
this.validator,
|
||||
this.boxConstraints,
|
||||
this.minLines,
|
||||
this.isForNumber = false,
|
||||
this.readonly = false,
|
||||
this.label,
|
||||
this.filled,
|
||||
this.errorStyle,
|
||||
this.labelStyle,
|
||||
this.enabled}) {
|
||||
_inputBorder = OutlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
borderRadius: BorderRadius.circular(radius ?? 16));
|
||||
obscure = false;
|
||||
filled = filled ?? true;
|
||||
}
|
||||
|
||||
RTextField.password(
|
||||
{super.key,
|
||||
this.maxLines = 1,
|
||||
this.maxLength,
|
||||
this.hintText,
|
||||
this.padding,
|
||||
this.onChanged,
|
||||
this.onSubmitted,
|
||||
this.keyboardType,
|
||||
this.showCounter = false,
|
||||
this.isDense,
|
||||
this.initText,
|
||||
this.style,
|
||||
this.hintStyle,
|
||||
this.suffixIcon,
|
||||
this.prefixIcon,
|
||||
this.radius,
|
||||
this.validator,
|
||||
this.boxConstraints,
|
||||
this.minLines,
|
||||
this.isForNumber = false,
|
||||
this.readonly = false,
|
||||
this.label,
|
||||
this.filled,
|
||||
this.errorStyle,
|
||||
this.labelStyle,
|
||||
this.enabled}) {
|
||||
_inputBorder = OutlineInputBorder(
|
||||
borderSide: BorderSide.none,
|
||||
borderRadius: BorderRadius.circular(radius ?? 16));
|
||||
filled = filled ?? true;
|
||||
obscure = true;
|
||||
_isPassword = true;
|
||||
prefixIcon = prefixIcon ?? const Icon(CupertinoIcons.person);
|
||||
}
|
||||
|
||||
final int? maxLines;
|
||||
final int? minLines;
|
||||
final int? maxLength;
|
||||
final String? hintText;
|
||||
final String? label;
|
||||
final EdgeInsets? padding;
|
||||
final TextStyle? style;
|
||||
final TextStyle? errorStyle;
|
||||
final TextStyle? hintStyle;
|
||||
final TextStyle? labelStyle;
|
||||
final bool showCounter;
|
||||
final bool? isDense;
|
||||
final bool? isForNumber;
|
||||
final bool readonly;
|
||||
bool? obscure;
|
||||
final bool? enabled;
|
||||
final double? radius;
|
||||
final TextInputType? keyboardType;
|
||||
final Function(String)? onChanged;
|
||||
final Function(String)? onSubmitted;
|
||||
final FormFieldValidator? validator;
|
||||
final String? initText;
|
||||
Widget? suffixIcon;
|
||||
Widget? prefixIcon;
|
||||
bool? filled;
|
||||
bool _isPassword = false;
|
||||
|
||||
final BoxConstraints? boxConstraints;
|
||||
late final InputBorder? _inputBorder;
|
||||
|
||||
@override
|
||||
State<RTextField> createState() => _RTextFieldState();
|
||||
}
|
||||
|
||||
class _RTextFieldState extends State<RTextField> {
|
||||
final TextEditingController _controller = TextEditingController();
|
||||
bool? obscure;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
if (widget.initText != null) {
|
||||
_controller.text = widget.initText!;
|
||||
}
|
||||
obscure = widget.obscure;
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(covariant RTextField oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
if (widget.initText != oldWidget.initText) {
|
||||
_controller.text = widget.initText ?? '';
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Padding(
|
||||
padding: widget.padding ?? const EdgeInsets.symmetric(vertical: 6.0),
|
||||
child: TextFormField(
|
||||
controller: _controller,
|
||||
readOnly: widget.readonly,
|
||||
minLines: widget.minLines,
|
||||
maxLines: widget.maxLines,
|
||||
onChanged: widget.onChanged,
|
||||
validator: widget.validator,
|
||||
enabled: widget.enabled,
|
||||
obscureText: obscure ?? false,
|
||||
onTapOutside: (event) {
|
||||
FocusScope.of(context).unfocus();
|
||||
},
|
||||
onFieldSubmitted: widget.onSubmitted,
|
||||
maxLength: widget.maxLength,
|
||||
textDirection: TextDirection.rtl,
|
||||
style: widget.style ,
|
||||
keyboardType: widget.keyboardType,
|
||||
decoration: InputDecoration(
|
||||
errorStyle: widget.errorStyle,
|
||||
errorMaxLines: 1,
|
||||
isDense: widget.isDense,
|
||||
suffixIcon: widget.suffixIcon ??
|
||||
(widget._isPassword
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
obscure = !obscure!;
|
||||
});
|
||||
},
|
||||
icon: Icon(!obscure!
|
||||
? CupertinoIcons.eye_slash
|
||||
: CupertinoIcons.eye))
|
||||
: null),
|
||||
suffixIconConstraints: widget.boxConstraints,
|
||||
prefixIcon: widget.prefixIcon,
|
||||
prefixIconConstraints: widget.boxConstraints,
|
||||
hintText: widget.hintText,
|
||||
labelText: widget.label,
|
||||
labelStyle: widget.labelStyle,
|
||||
filled: widget.filled,
|
||||
counter: widget.showCounter ? null : const SizedBox(),
|
||||
hintStyle: widget.hintStyle,
|
||||
enabledBorder: widget._inputBorder,
|
||||
focusedBorder: widget._inputBorder,
|
||||
border: widget._inputBorder),
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,255 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
|
||||
class PaginationFromUntil extends StatefulWidget {
|
||||
const PaginationFromUntil({super.key});
|
||||
|
||||
@override
|
||||
State<PaginationFromUntil> createState() => _PaginationFromUntilState();
|
||||
}
|
||||
|
||||
class _PaginationFromUntilState extends State<PaginationFromUntil> {
|
||||
int current = 1;
|
||||
int total = 10;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
width: 164,
|
||||
height: 47,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: ShapeDecoration(
|
||||
color: const Color(0xFFEAEFFF),
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
FloatingActionButton.small(
|
||||
onPressed: () {
|
||||
if(current>1){
|
||||
setState(() {
|
||||
current--;
|
||||
});
|
||||
}
|
||||
|
||||
},
|
||||
shape: CircleBorder(),
|
||||
elevation: 0,
|
||||
backgroundColor: Colors.white,
|
||||
child: Icon(CupertinoIcons.arrow_left, color: AppColor.blueNormal),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
'$current از $total',
|
||||
textAlign: TextAlign.center,
|
||||
textDirection: TextDirection.rtl,
|
||||
style: AppFonts.yekan16.copyWith(
|
||||
color: AppColor.blueNormal,
|
||||
),
|
||||
),
|
||||
),
|
||||
FloatingActionButton.small(
|
||||
|
||||
onPressed:() {
|
||||
if (current < total) {
|
||||
setState(() {
|
||||
current++;
|
||||
});
|
||||
}
|
||||
},
|
||||
shape: CircleBorder(),
|
||||
elevation: 0,
|
||||
backgroundColor: AppColor.blueNormal,
|
||||
child: Icon(CupertinoIcons.arrow_right, color: Colors.white),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Stack buildStack() {
|
||||
return Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 4,
|
||||
top: 4,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 40,
|
||||
top: 40,
|
||||
child: Container(
|
||||
transform:
|
||||
Matrix4.identity()
|
||||
..translate(0.0, 0.0)
|
||||
..rotateZ(-3.14),
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: ShapeDecoration(
|
||||
color:
|
||||
Colors.white /* Secondary */,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
width: 1,
|
||||
color:
|
||||
Colors
|
||||
.white /* Secondary */,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(50),
|
||||
),
|
||||
),
|
||||
child: Stack(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 8,
|
||||
top: 8,
|
||||
child: Container(width: 24, height: 24, child: Stack()),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 120,
|
||||
top: 3,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 40,
|
||||
top: 40,
|
||||
child: Container(
|
||||
transform:
|
||||
Matrix4.identity()
|
||||
..translate(0.0, 0.0)
|
||||
..rotateZ(-3.14),
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
child: Stack(
|
||||
children: [
|
||||
Positioned(
|
||||
left: 0,
|
||||
top: 0,
|
||||
child: Container(
|
||||
width: 40,
|
||||
height: 40,
|
||||
clipBehavior: Clip.antiAlias,
|
||||
decoration: ShapeDecoration(
|
||||
color: const Color(
|
||||
0xFF2D5FFF,
|
||||
) /* Primary */,
|
||||
shape: RoundedRectangleBorder(
|
||||
side: BorderSide(
|
||||
width: 1,
|
||||
color: const Color(
|
||||
0xFF2D5FFF,
|
||||
) /* Primary */,
|
||||
),
|
||||
borderRadius:
|
||||
BorderRadius.circular(50),
|
||||
),
|
||||
),
|
||||
child: Stack(),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 8,
|
||||
top: 8,
|
||||
child: Container(width: 24, height: 24, child: Stack()),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 63,
|
||||
top: 9,
|
||||
child: Text(
|
||||
'1 از 17',
|
||||
style: TextStyle(
|
||||
color: const Color(0xFF2D5FFF) /* Primary */,
|
||||
fontSize: 16,
|
||||
fontFamily: 'IRANYekanFN',
|
||||
fontWeight: FontWeight.w400,
|
||||
height: 1.75,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
|
||||
class RShowMore extends StatefulWidget {
|
||||
const RShowMore({super.key});
|
||||
|
||||
@override
|
||||
State<RShowMore> createState() => _RShowMoreState();
|
||||
}
|
||||
|
||||
class _RShowMoreState extends State<RShowMore>
|
||||
with SingleTickerProviderStateMixin {
|
||||
bool _toggled = false;
|
||||
late final AnimationController _controller;
|
||||
late final Animation<double> _iconRotation;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
_controller = AnimationController(
|
||||
vsync: this,
|
||||
duration: const Duration(milliseconds: 500),
|
||||
);
|
||||
_iconRotation = Tween<double>(
|
||||
begin: 0,
|
||||
end: 0.50,
|
||||
) // 90 degrees (quarter turn)
|
||||
.animate(CurvedAnimation(parent: _controller, curve: Curves.easeInOut));
|
||||
}
|
||||
|
||||
void _toggle() {
|
||||
setState(() => _toggled = !_toggled);
|
||||
_toggled ? _controller.forward() : _controller.reverse();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controller.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: _toggle,
|
||||
behavior: HitTestBehavior.opaque,
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 8,
|
||||
children: [
|
||||
RotationTransition(
|
||||
turns: _iconRotation,
|
||||
child: const Icon(CupertinoIcons.chevron_down, size: 12,color:AppColor.blueNormal ,),
|
||||
),
|
||||
|
||||
AnimatedSwitcher(
|
||||
duration: const Duration(milliseconds: 500),
|
||||
transitionBuilder:
|
||||
(child, animation) =>
|
||||
FadeTransition(opacity: animation, child: child),
|
||||
child: Text(
|
||||
_toggled ? 'کمتر' : 'مشاهده بیشتر',
|
||||
key: ValueKey(_toggled),
|
||||
style: AppFonts.yekan10.copyWith(color: AppColor.blueNormal),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 50,)
|
||||
],
|
||||
|
||||
|
||||
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
784
packages/core/lib/presentation/widget/tabs/new_tab.dart
Normal file
784
packages/core/lib/presentation/widget/tabs/new_tab.dart
Normal file
@@ -0,0 +1,784 @@
|
||||
// Copyright 2014 The Flutter Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
/// @docImport 'switch.dart';
|
||||
library;
|
||||
|
||||
import 'dart:collection';
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
// Minimum padding from edges of the segmented control to edges of
|
||||
// encompassing widget.
|
||||
const EdgeInsetsGeometry _kHorizontalItemPadding = EdgeInsets.symmetric(
|
||||
horizontal: 16.0,
|
||||
);
|
||||
|
||||
// Minimum height of the segmented control.
|
||||
const double _kMinSegmentedControlHeight = 28.0;
|
||||
|
||||
// The default color used for the text of the disabled segment.
|
||||
const Color _kDisableTextColor = Color.fromARGB(115, 122, 122, 122);
|
||||
|
||||
// The duration of the fade animation used to transition when a new widget
|
||||
// is selected.
|
||||
const Duration _kFadeDuration = Duration(milliseconds: 165);
|
||||
|
||||
class NewCupertinoSegmentedControl<T extends Object> extends StatefulWidget {
|
||||
/// Creates an iOS-style segmented control bar.
|
||||
///
|
||||
/// The [children] argument must be an ordered [Map] such as a
|
||||
/// [LinkedHashMap]. Further, the length of the [children] list must be
|
||||
/// greater than one.
|
||||
///
|
||||
/// Each widget value in the map of [children] must have an associated key
|
||||
/// that uniquely identifies this widget. This key is what will be returned
|
||||
/// in the [onValueChanged] callback when a new value from the [children] map
|
||||
/// is selected.
|
||||
///
|
||||
/// The [groupValue] is the currently selected value for the segmented control.
|
||||
/// If no [groupValue] is provided, or the [groupValue] is null, no widget will
|
||||
/// appear as selected. The [groupValue] must be either null or one of the keys
|
||||
/// in the [children] map.
|
||||
NewCupertinoSegmentedControl({
|
||||
super.key,
|
||||
required this.children,
|
||||
required this.onValueChanged,
|
||||
this.groupValue,
|
||||
this.unselectedColor,
|
||||
this.selectedColor,
|
||||
this.borderColor,
|
||||
this.pressedColor,
|
||||
this.disabledColor,
|
||||
this.disabledTextColor,
|
||||
this.padding,
|
||||
this.disabledChildren = const <Never>{},
|
||||
}) : assert(children.length >= 2),
|
||||
assert(
|
||||
groupValue == null ||
|
||||
children.keys.any((T child) => child == groupValue),
|
||||
'The groupValue must be either null or one of the keys in the children map.',
|
||||
);
|
||||
|
||||
/// The identifying keys and corresponding widget values in the
|
||||
/// segmented control.
|
||||
///
|
||||
/// The map must have more than one entry.
|
||||
/// This attribute must be an ordered [Map] such as a [LinkedHashMap].
|
||||
final Map<T, Widget> children;
|
||||
|
||||
/// The identifier of the widget that is currently selected.
|
||||
///
|
||||
/// This must be one of the keys in the [Map] of [children].
|
||||
/// If this attribute is null, no widget will be initially selected.
|
||||
final T? groupValue;
|
||||
|
||||
/// The callback that is called when a new option is tapped.
|
||||
///
|
||||
/// The segmented control passes the newly selected widget's associated key
|
||||
/// to the callback but does not actually change state until the parent
|
||||
/// widget rebuilds the segmented control with the new [groupValue].
|
||||
final ValueChanged<T> onValueChanged;
|
||||
|
||||
/// The color used to fill the backgrounds of unselected widgets and as the
|
||||
/// text color of the selected widget.
|
||||
///
|
||||
/// Defaults to [CupertinoTheme]'s `primaryContrastingColor` if null.
|
||||
final Color? unselectedColor;
|
||||
|
||||
/// The color used to fill the background of the selected widget and as the text
|
||||
/// color of unselected widgets.
|
||||
///
|
||||
/// Defaults to [CupertinoTheme]'s `primaryColor` if null.
|
||||
final Color? selectedColor;
|
||||
|
||||
/// The color used as the border around each widget.
|
||||
///
|
||||
/// Defaults to [CupertinoTheme]'s `primaryColor` if null.
|
||||
final Color? borderColor;
|
||||
|
||||
/// The color used to fill the background of the widget the user is
|
||||
/// temporarily interacting with through a long press or drag.
|
||||
///
|
||||
/// Defaults to the selectedColor at 20% opacity if null.
|
||||
final Color? pressedColor;
|
||||
|
||||
/// The color used to fill the background of the segment when it is disabled.
|
||||
///
|
||||
/// If null, this color will be 50% opacity of the [selectedColor] when
|
||||
/// the segment is selected. If the segment is unselected, this color will be
|
||||
/// set to [unselectedColor].
|
||||
final Color? disabledColor;
|
||||
|
||||
/// The color used for the text of the segment when it is disabled.
|
||||
final Color? disabledTextColor;
|
||||
|
||||
/// The CupertinoSegmentedControl will be placed inside this padding.
|
||||
///
|
||||
/// Defaults to EdgeInsets.symmetric(horizontal: 16.0)
|
||||
final EdgeInsetsGeometry? padding;
|
||||
|
||||
/// The set of identifying keys that correspond to the segments that should be disabled.
|
||||
///
|
||||
/// All segments are enabled by default.
|
||||
final Set<T> disabledChildren;
|
||||
|
||||
@override
|
||||
State<NewCupertinoSegmentedControl<T>> createState() =>
|
||||
_SegmentedControlState<T>();
|
||||
}
|
||||
|
||||
class _SegmentedControlState<T extends Object>
|
||||
extends State<NewCupertinoSegmentedControl<T>>
|
||||
with TickerProviderStateMixin<NewCupertinoSegmentedControl<T>> {
|
||||
T? _pressedKey;
|
||||
|
||||
final List<AnimationController> _selectionControllers =
|
||||
<AnimationController>[];
|
||||
final List<ColorTween> _childTweens = <ColorTween>[];
|
||||
|
||||
late ColorTween _forwardBackgroundColorTween;
|
||||
late ColorTween _reverseBackgroundColorTween;
|
||||
late ColorTween _textColorTween;
|
||||
|
||||
Color? _selectedColor;
|
||||
Color? _unselectedColor;
|
||||
Color? _borderColor;
|
||||
Color? _pressedColor;
|
||||
Color? _selectedDisabledColor;
|
||||
Color? _unselectedDisabledColor;
|
||||
Color? _disabledTextColor;
|
||||
|
||||
AnimationController createAnimationController() {
|
||||
return AnimationController(duration: _kFadeDuration, vsync: this)
|
||||
..addListener(() {
|
||||
setState(() {
|
||||
// State of background/text colors has changed
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
bool _updateColors() {
|
||||
assert(mounted, 'This should only be called after didUpdateDependencies');
|
||||
bool changed = false;
|
||||
final Color disabledTextColor =
|
||||
widget.disabledTextColor ?? _kDisableTextColor;
|
||||
if (_disabledTextColor != disabledTextColor) {
|
||||
changed = true;
|
||||
_disabledTextColor = disabledTextColor;
|
||||
}
|
||||
final Color selectedColor =
|
||||
widget.selectedColor ?? CupertinoTheme.of(context).primaryColor;
|
||||
if (_selectedColor != selectedColor) {
|
||||
changed = true;
|
||||
_selectedColor = selectedColor;
|
||||
}
|
||||
final Color unselectedColor =
|
||||
widget.unselectedColor ??
|
||||
CupertinoTheme.of(context).primaryContrastingColor;
|
||||
if (_unselectedColor != unselectedColor) {
|
||||
changed = true;
|
||||
_unselectedColor = unselectedColor;
|
||||
}
|
||||
final Color selectedDisabledColor =
|
||||
widget.disabledColor ?? selectedColor.withOpacity(0.5);
|
||||
final Color unselectedDisabledColor =
|
||||
widget.disabledColor ?? unselectedColor;
|
||||
if (_selectedDisabledColor != selectedDisabledColor ||
|
||||
_unselectedDisabledColor != unselectedDisabledColor) {
|
||||
changed = true;
|
||||
_selectedDisabledColor = selectedDisabledColor;
|
||||
_unselectedDisabledColor = unselectedDisabledColor;
|
||||
}
|
||||
final Color borderColor =
|
||||
widget.borderColor ?? CupertinoTheme.of(context).primaryColor;
|
||||
if (_borderColor != borderColor) {
|
||||
changed = true;
|
||||
_borderColor = borderColor;
|
||||
}
|
||||
final Color pressedColor =
|
||||
widget.pressedColor ??
|
||||
CupertinoTheme.of(context).primaryColor.withOpacity(0.2);
|
||||
if (_pressedColor != pressedColor) {
|
||||
changed = true;
|
||||
_pressedColor = pressedColor;
|
||||
}
|
||||
|
||||
_forwardBackgroundColorTween = ColorTween(
|
||||
begin: _pressedColor,
|
||||
end: _selectedColor,
|
||||
);
|
||||
_reverseBackgroundColorTween = ColorTween(
|
||||
begin: _unselectedColor,
|
||||
end: _selectedColor,
|
||||
);
|
||||
_textColorTween = ColorTween(begin: _selectedColor, end: _unselectedColor);
|
||||
return changed;
|
||||
}
|
||||
|
||||
void _updateAnimationControllers() {
|
||||
assert(mounted, 'This should only be called after didUpdateDependencies');
|
||||
for (final AnimationController controller in _selectionControllers) {
|
||||
controller.dispose();
|
||||
}
|
||||
_selectionControllers.clear();
|
||||
_childTweens.clear();
|
||||
|
||||
for (final T key in widget.children.keys) {
|
||||
final AnimationController animationController =
|
||||
createAnimationController();
|
||||
if (widget.groupValue == key) {
|
||||
_childTweens.add(_reverseBackgroundColorTween);
|
||||
animationController.value = 1.0;
|
||||
} else {
|
||||
_childTweens.add(_forwardBackgroundColorTween);
|
||||
}
|
||||
_selectionControllers.add(animationController);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
|
||||
if (_updateColors()) {
|
||||
_updateAnimationControllers();
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void didUpdateWidget(NewCupertinoSegmentedControl<T> oldWidget) {
|
||||
super.didUpdateWidget(oldWidget);
|
||||
|
||||
if (_updateColors() ||
|
||||
oldWidget.children.length != widget.children.length) {
|
||||
_updateAnimationControllers();
|
||||
}
|
||||
|
||||
if (oldWidget.groupValue != widget.groupValue) {
|
||||
int index = 0;
|
||||
for (final T key in widget.children.keys) {
|
||||
if (widget.groupValue == key) {
|
||||
_childTweens[index] = _forwardBackgroundColorTween;
|
||||
_selectionControllers[index].forward();
|
||||
} else {
|
||||
_childTweens[index] = _reverseBackgroundColorTween;
|
||||
_selectionControllers[index].reverse();
|
||||
}
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
for (final AnimationController animationController
|
||||
in _selectionControllers) {
|
||||
animationController.dispose();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
void _onTapDown(T currentKey) {
|
||||
if (_pressedKey == null && currentKey != widget.groupValue) {
|
||||
setState(() {
|
||||
_pressedKey = currentKey;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _onTapCancel() {
|
||||
setState(() {
|
||||
_pressedKey = null;
|
||||
});
|
||||
}
|
||||
|
||||
void _onTap(T currentKey) {
|
||||
if (currentKey != _pressedKey) {
|
||||
return;
|
||||
}
|
||||
if (!widget.disabledChildren.contains(currentKey)) {
|
||||
if (currentKey != widget.groupValue) {
|
||||
widget.onValueChanged(currentKey);
|
||||
}
|
||||
}
|
||||
_pressedKey = null;
|
||||
}
|
||||
|
||||
Color? getTextColor(int index, T currentKey) {
|
||||
if (widget.disabledChildren.contains(currentKey)) {
|
||||
return _disabledTextColor;
|
||||
}
|
||||
if (_selectionControllers[index].isAnimating) {
|
||||
return _textColorTween.evaluate(_selectionControllers[index]);
|
||||
}
|
||||
if (widget.groupValue == currentKey) {
|
||||
return _unselectedColor;
|
||||
}
|
||||
return _selectedColor;
|
||||
}
|
||||
|
||||
Color? getBackgroundColor(int index, T currentKey) {
|
||||
if (widget.disabledChildren.contains(currentKey)) {
|
||||
return widget.groupValue == currentKey
|
||||
? _selectedDisabledColor
|
||||
: _unselectedDisabledColor;
|
||||
}
|
||||
if (_selectionControllers[index].isAnimating) {
|
||||
return _childTweens[index].evaluate(_selectionControllers[index]);
|
||||
}
|
||||
if (widget.groupValue == currentKey) {
|
||||
return _selectedColor;
|
||||
}
|
||||
if (_pressedKey == currentKey) {
|
||||
return _pressedColor;
|
||||
}
|
||||
return _unselectedColor;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final List<Widget> gestureChildren = <Widget>[];
|
||||
final List<Color> backgroundColors = <Color>[];
|
||||
int index = 0;
|
||||
int? selectedIndex;
|
||||
int? pressedIndex;
|
||||
for (final T currentKey in widget.children.keys) {
|
||||
selectedIndex = (widget.groupValue == currentKey) ? index : selectedIndex;
|
||||
pressedIndex = (_pressedKey == currentKey) ? index : pressedIndex;
|
||||
|
||||
final TextStyle textStyle = DefaultTextStyle.of(
|
||||
context,
|
||||
).style.copyWith(color: getTextColor(index, currentKey));
|
||||
final IconThemeData iconTheme = IconThemeData(
|
||||
color: getTextColor(index, currentKey),
|
||||
);
|
||||
|
||||
Widget child = Center(child: widget.children[currentKey]);
|
||||
|
||||
child = MouseRegion(
|
||||
cursor: kIsWeb ? SystemMouseCursors.click : MouseCursor.defer,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTapDown:
|
||||
widget.disabledChildren.contains(currentKey)
|
||||
? null
|
||||
: (TapDownDetails event) {
|
||||
_onTapDown(currentKey);
|
||||
},
|
||||
onTapCancel:
|
||||
widget.disabledChildren.contains(currentKey)
|
||||
? null
|
||||
: _onTapCancel,
|
||||
onTap: () {
|
||||
_onTap(currentKey);
|
||||
},
|
||||
child: IconTheme(
|
||||
data: iconTheme,
|
||||
child: DefaultTextStyle(
|
||||
style: textStyle,
|
||||
child: Semantics(
|
||||
button: true,
|
||||
inMutuallyExclusiveGroup: true,
|
||||
selected: widget.groupValue == currentKey,
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
backgroundColors.add(getBackgroundColor(index, currentKey)!);
|
||||
gestureChildren.add(child);
|
||||
index += 1;
|
||||
}
|
||||
|
||||
final Widget box = _SegmentedControlRenderWidget<T>(
|
||||
selectedIndex: selectedIndex,
|
||||
pressedIndex: pressedIndex,
|
||||
backgroundColors: backgroundColors,
|
||||
borderColor: _borderColor!,
|
||||
children: gestureChildren,
|
||||
);
|
||||
|
||||
return Padding(
|
||||
padding: widget.padding ?? _kHorizontalItemPadding,
|
||||
child: UnconstrainedBox(constrainedAxis: Axis.horizontal, child: box),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class _SegmentedControlRenderWidget<T> extends MultiChildRenderObjectWidget {
|
||||
const _SegmentedControlRenderWidget({
|
||||
super.key,
|
||||
super.children,
|
||||
required this.selectedIndex,
|
||||
required this.pressedIndex,
|
||||
required this.backgroundColors,
|
||||
required this.borderColor,
|
||||
});
|
||||
|
||||
final int? selectedIndex;
|
||||
final int? pressedIndex;
|
||||
final List<Color> backgroundColors;
|
||||
final Color borderColor;
|
||||
|
||||
@override
|
||||
RenderObject createRenderObject(BuildContext context) {
|
||||
return _RenderSegmentedControl<T>(
|
||||
textDirection: Directionality.of(context),
|
||||
selectedIndex: selectedIndex,
|
||||
pressedIndex: pressedIndex,
|
||||
backgroundColors: backgroundColors,
|
||||
borderColor: borderColor,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void updateRenderObject(
|
||||
BuildContext context,
|
||||
_RenderSegmentedControl<T> renderObject,
|
||||
) {
|
||||
renderObject
|
||||
..textDirection = Directionality.of(context)
|
||||
..selectedIndex = selectedIndex
|
||||
..pressedIndex = pressedIndex
|
||||
..backgroundColors = backgroundColors
|
||||
..borderColor = borderColor;
|
||||
}
|
||||
}
|
||||
|
||||
class _SegmentedControlContainerBoxParentData
|
||||
extends ContainerBoxParentData<RenderBox> {
|
||||
RRect? surroundingRect;
|
||||
}
|
||||
|
||||
typedef _NextChild = RenderBox? Function(RenderBox child);
|
||||
|
||||
class _RenderSegmentedControl<T> extends RenderBox
|
||||
with
|
||||
ContainerRenderObjectMixin<
|
||||
RenderBox,
|
||||
ContainerBoxParentData<RenderBox>
|
||||
>,
|
||||
RenderBoxContainerDefaultsMixin<
|
||||
RenderBox,
|
||||
ContainerBoxParentData<RenderBox>
|
||||
> {
|
||||
_RenderSegmentedControl({
|
||||
required int? selectedIndex,
|
||||
required int? pressedIndex,
|
||||
required TextDirection textDirection,
|
||||
required List<Color> backgroundColors,
|
||||
required Color borderColor,
|
||||
}) : _textDirection = textDirection,
|
||||
_selectedIndex = selectedIndex,
|
||||
_pressedIndex = pressedIndex,
|
||||
_backgroundColors = backgroundColors,
|
||||
_borderColor = borderColor;
|
||||
|
||||
int? get selectedIndex => _selectedIndex;
|
||||
int? _selectedIndex;
|
||||
|
||||
set selectedIndex(int? value) {
|
||||
if (_selectedIndex == value) {
|
||||
return;
|
||||
}
|
||||
_selectedIndex = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
int? get pressedIndex => _pressedIndex;
|
||||
int? _pressedIndex;
|
||||
|
||||
set pressedIndex(int? value) {
|
||||
if (_pressedIndex == value) {
|
||||
return;
|
||||
}
|
||||
_pressedIndex = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
TextDirection get textDirection => _textDirection;
|
||||
TextDirection _textDirection;
|
||||
|
||||
set textDirection(TextDirection value) {
|
||||
if (_textDirection == value) {
|
||||
return;
|
||||
}
|
||||
_textDirection = value;
|
||||
markNeedsLayout();
|
||||
}
|
||||
|
||||
List<Color> get backgroundColors => _backgroundColors;
|
||||
List<Color> _backgroundColors;
|
||||
|
||||
set backgroundColors(List<Color> value) {
|
||||
if (_backgroundColors == value) {
|
||||
return;
|
||||
}
|
||||
_backgroundColors = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
Color get borderColor => _borderColor;
|
||||
Color _borderColor;
|
||||
|
||||
set borderColor(Color value) {
|
||||
if (_borderColor == value) {
|
||||
return;
|
||||
}
|
||||
_borderColor = value;
|
||||
markNeedsPaint();
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMinIntrinsicWidth(double height) {
|
||||
RenderBox? child = firstChild;
|
||||
double minWidth = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childWidth = child.getMinIntrinsicWidth(height);
|
||||
minWidth = math.max(minWidth, childWidth);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return minWidth * childCount;
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMaxIntrinsicWidth(double height) {
|
||||
RenderBox? child = firstChild;
|
||||
double maxWidth = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childWidth = child.getMaxIntrinsicWidth(height);
|
||||
maxWidth = math.max(maxWidth, childWidth);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return maxWidth * childCount;
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMinIntrinsicHeight(double width) {
|
||||
RenderBox? child = firstChild;
|
||||
double minHeight = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childHeight = child.getMinIntrinsicHeight(width);
|
||||
minHeight = math.max(minHeight, childHeight);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return minHeight;
|
||||
}
|
||||
|
||||
@override
|
||||
double computeMaxIntrinsicHeight(double width) {
|
||||
RenderBox? child = firstChild;
|
||||
double maxHeight = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final double childHeight = child.getMaxIntrinsicHeight(width);
|
||||
maxHeight = math.max(maxHeight, childHeight);
|
||||
child = childParentData.nextSibling;
|
||||
}
|
||||
return maxHeight;
|
||||
}
|
||||
|
||||
@override
|
||||
double? computeDistanceToActualBaseline(TextBaseline baseline) {
|
||||
return defaultComputeDistanceToHighestActualBaseline(baseline);
|
||||
}
|
||||
|
||||
@override
|
||||
void setupParentData(RenderBox child) {
|
||||
if (child.parentData is! _SegmentedControlContainerBoxParentData) {
|
||||
child.parentData = _SegmentedControlContainerBoxParentData();
|
||||
}
|
||||
}
|
||||
|
||||
void _layoutRects(
|
||||
_NextChild nextChild,
|
||||
RenderBox? leftChild,
|
||||
RenderBox? rightChild,
|
||||
) {
|
||||
RenderBox? child = leftChild;
|
||||
double start = 0.0;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
final Offset childOffset = Offset(start, 0.0);
|
||||
childParentData.offset = childOffset;
|
||||
final Rect childRect = Rect.fromLTWH(
|
||||
start,
|
||||
0.0,
|
||||
child.size.width,
|
||||
child.size.height,
|
||||
);
|
||||
final RRect rChildRect;
|
||||
if (child == leftChild) {
|
||||
rChildRect = RRect.fromRectAndCorners(
|
||||
childRect,
|
||||
topLeft: const Radius.circular(10.0),
|
||||
bottomLeft: const Radius.circular(10.0),
|
||||
);
|
||||
} else if (child == rightChild) {
|
||||
rChildRect = RRect.fromRectAndCorners(
|
||||
childRect,
|
||||
topRight: const Radius.circular(10.0),
|
||||
bottomRight: const Radius.circular(10.0),
|
||||
);
|
||||
} else {
|
||||
rChildRect = RRect.fromRectAndCorners(childRect);
|
||||
}
|
||||
childParentData.surroundingRect = rChildRect;
|
||||
start += child.size.width;
|
||||
child = nextChild(child);
|
||||
}
|
||||
}
|
||||
|
||||
Size _calculateChildSize(BoxConstraints constraints) {
|
||||
double maxHeight = _kMinSegmentedControlHeight;
|
||||
double childWidth = constraints.minWidth / childCount;
|
||||
RenderBox? child = firstChild;
|
||||
while (child != null) {
|
||||
childWidth = math.max(
|
||||
childWidth,
|
||||
child.getMaxIntrinsicWidth(double.infinity),
|
||||
);
|
||||
child = childAfter(child);
|
||||
}
|
||||
childWidth = math.min(childWidth, constraints.maxWidth / childCount);
|
||||
child = firstChild;
|
||||
while (child != null) {
|
||||
final double boxHeight = child.getMaxIntrinsicHeight(childWidth);
|
||||
maxHeight = math.max(maxHeight, boxHeight);
|
||||
child = childAfter(child);
|
||||
}
|
||||
return Size(childWidth, maxHeight);
|
||||
}
|
||||
|
||||
Size _computeOverallSizeFromChildSize(Size childSize) {
|
||||
return constraints.constrain(
|
||||
Size(childSize.width * childCount, childSize.height),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
double? computeDryBaseline(
|
||||
covariant BoxConstraints constraints,
|
||||
TextBaseline baseline,
|
||||
) {
|
||||
final Size childSize = _calculateChildSize(constraints);
|
||||
final BoxConstraints childConstraints = BoxConstraints.tight(childSize);
|
||||
|
||||
BaselineOffset baselineOffset = BaselineOffset.noBaseline;
|
||||
for (
|
||||
RenderBox? child = firstChild;
|
||||
child != null;
|
||||
child = childAfter(child)
|
||||
) {
|
||||
baselineOffset = baselineOffset.minOf(
|
||||
BaselineOffset(child.getDryBaseline(childConstraints, baseline)),
|
||||
);
|
||||
}
|
||||
return baselineOffset.offset;
|
||||
}
|
||||
|
||||
@override
|
||||
Size computeDryLayout(BoxConstraints constraints) {
|
||||
final Size childSize = _calculateChildSize(constraints);
|
||||
return _computeOverallSizeFromChildSize(childSize);
|
||||
}
|
||||
|
||||
@override
|
||||
void performLayout() {
|
||||
final BoxConstraints constraints = this.constraints;
|
||||
final Size childSize = _calculateChildSize(constraints);
|
||||
|
||||
final BoxConstraints childConstraints = BoxConstraints.tightFor(
|
||||
width: childSize.width,
|
||||
height: childSize.height,
|
||||
);
|
||||
|
||||
RenderBox? child = firstChild;
|
||||
while (child != null) {
|
||||
child.layout(childConstraints, parentUsesSize: true);
|
||||
child = childAfter(child);
|
||||
}
|
||||
|
||||
switch (textDirection) {
|
||||
case TextDirection.rtl:
|
||||
_layoutRects(childBefore, lastChild, firstChild);
|
||||
case TextDirection.ltr:
|
||||
_layoutRects(childAfter, firstChild, lastChild);
|
||||
}
|
||||
|
||||
size = _computeOverallSizeFromChildSize(childSize);
|
||||
}
|
||||
|
||||
@override
|
||||
void paint(PaintingContext context, Offset offset) {
|
||||
RenderBox? child = firstChild;
|
||||
int index = 0;
|
||||
while (child != null) {
|
||||
_paintChild(context, offset, child, index);
|
||||
child = childAfter(child);
|
||||
index += 1;
|
||||
}
|
||||
}
|
||||
|
||||
void _paintChild(
|
||||
PaintingContext context,
|
||||
Offset offset,
|
||||
RenderBox child,
|
||||
int childIndex,
|
||||
) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
|
||||
context.canvas.drawRRect(
|
||||
childParentData.surroundingRect!.shift(offset),
|
||||
Paint()
|
||||
..color = backgroundColors[childIndex]
|
||||
..style = PaintingStyle.fill,
|
||||
);
|
||||
context.canvas.drawRRect(
|
||||
childParentData.surroundingRect!.shift(offset),
|
||||
Paint()
|
||||
..color = borderColor
|
||||
..strokeWidth = 1.0
|
||||
..style = PaintingStyle.stroke,
|
||||
);
|
||||
|
||||
context.paintChild(child, childParentData.offset + offset);
|
||||
}
|
||||
|
||||
@override
|
||||
bool hitTestChildren(BoxHitTestResult result, {required Offset position}) {
|
||||
RenderBox? child = lastChild;
|
||||
while (child != null) {
|
||||
final _SegmentedControlContainerBoxParentData childParentData =
|
||||
child.parentData! as _SegmentedControlContainerBoxParentData;
|
||||
if (childParentData.surroundingRect!.contains(position)) {
|
||||
return result.addWithPaintOffset(
|
||||
offset: childParentData.offset,
|
||||
position: position,
|
||||
hitTest: (BoxHitTestResult result, Offset localOffset) {
|
||||
assert(localOffset == position - childParentData.offset);
|
||||
return child!.hitTest(result, position: localOffset);
|
||||
},
|
||||
);
|
||||
}
|
||||
child = childParentData.previousSibling;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
115
packages/core/lib/presentation/widget/tabs/tab.dart
Normal file
115
packages/core/lib/presentation/widget/tabs/tab.dart
Normal file
@@ -0,0 +1,115 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_color.dart';
|
||||
import 'package:rasadyar_core/presentation/common/app_fonts.dart';
|
||||
|
||||
import 'new_tab.dart';
|
||||
|
||||
class CupertinoSegmentedControlDemo extends StatefulWidget {
|
||||
const CupertinoSegmentedControlDemo({super.key});
|
||||
|
||||
@override
|
||||
State<CupertinoSegmentedControlDemo> createState() =>
|
||||
_CupertinoSegmentedControlDemoState();
|
||||
}
|
||||
|
||||
class _CupertinoSegmentedControlDemoState
|
||||
extends State<CupertinoSegmentedControlDemo> {
|
||||
int _selectedSegment = 0;
|
||||
|
||||
// The data for the segments
|
||||
final Map<int, Widget> _segments = const {
|
||||
0: Text('Segment 1'),
|
||||
1: Text('Segment 2'),
|
||||
2: Text('Segment 3'),
|
||||
};
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
CupertinoSlidingSegmentedControl<int>(
|
||||
children: _segments,
|
||||
groupValue: _selectedSegment,
|
||||
|
||||
onValueChanged: (int? value) {
|
||||
setState(() {
|
||||
_selectedSegment = value!;
|
||||
});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Text(
|
||||
'Selected Segment: ${_selectedSegment + 1}',
|
||||
style: const TextStyle(fontSize: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class CupertinoSegmentedControlDemo2 extends StatefulWidget {
|
||||
const CupertinoSegmentedControlDemo2({super.key});
|
||||
|
||||
@override
|
||||
State<CupertinoSegmentedControlDemo2> createState() =>
|
||||
_CupertinoSegmentedControlDemoState2();
|
||||
}
|
||||
|
||||
class _CupertinoSegmentedControlDemoState2
|
||||
extends State<CupertinoSegmentedControlDemo2> {
|
||||
int _selectedSegment = 0;
|
||||
|
||||
// The data for the segments
|
||||
final Map<int, Widget> _segments = {
|
||||
0:Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50)
|
||||
),
|
||||
child: Text('لاشه', style: AppFonts.yekan13),
|
||||
),
|
||||
1: Container(
|
||||
padding: EdgeInsets.all(10),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(50)
|
||||
),
|
||||
child: Text('زنده', style: AppFonts.yekan13),
|
||||
),
|
||||
};
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
NewCupertinoSegmentedControl<int>(
|
||||
padding: EdgeInsetsDirectional.symmetric(
|
||||
horizontal: 20,
|
||||
vertical: 10,
|
||||
),
|
||||
children: _segments,
|
||||
groupValue: _selectedSegment,
|
||||
selectedColor: AppColor.blueNormal,
|
||||
unselectedColor: Colors.white,
|
||||
borderColor: Colors.grey.shade300,
|
||||
onValueChanged: (int value) {
|
||||
setState(() {
|
||||
_selectedSegment = value;
|
||||
});
|
||||
},
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
Text(
|
||||
'Selected Segment: ${_selectedSegment + 1}',
|
||||
style: const TextStyle(fontSize: 24),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
66
packages/core/lib/presentation/widget/vec_widget.dart
Normal file
66
packages/core/lib/presentation/widget/vec_widget.dart
Normal file
@@ -0,0 +1,66 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:vector_graphics/vector_graphics.dart';
|
||||
|
||||
SvgPicture vecWidget(
|
||||
String assets, {
|
||||
double? width,
|
||||
double? height,
|
||||
BoxFit? fit,
|
||||
Color? color,
|
||||
}) {
|
||||
return SvgPicture(
|
||||
AssetBytesLoader(assets),
|
||||
width: width,
|
||||
height: height,
|
||||
fit: fit ?? BoxFit.contain,
|
||||
colorFilter:
|
||||
color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null,
|
||||
);
|
||||
}
|
||||
|
||||
SvgPicture svgWidget(
|
||||
String assets, {
|
||||
double? width,
|
||||
double? height,
|
||||
BoxFit? fit,
|
||||
Color? color,
|
||||
}) {
|
||||
return SvgPicture.asset(
|
||||
assets,
|
||||
width: width,
|
||||
height: height,
|
||||
fit: fit ?? BoxFit.contain,
|
||||
colorFilter:
|
||||
color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Widget vecWidget2(
|
||||
String assets, {
|
||||
double? width,
|
||||
double? height,
|
||||
BoxFit? fit,
|
||||
Color? color,
|
||||
}) {
|
||||
final resolvedColor = WidgetStateProperty.resolveWith<Color?>((states) {
|
||||
if (states.contains(WidgetState.pressed)) {
|
||||
return Colors.white;
|
||||
}
|
||||
return color;
|
||||
}).resolve({}); // You can pass actual states if needed
|
||||
|
||||
return IconTheme(
|
||||
data: IconThemeData(color: resolvedColor),
|
||||
child: SvgPicture(
|
||||
AssetBytesLoader(assets),
|
||||
width: width,
|
||||
height: height,
|
||||
fit: fit ?? BoxFit.contain,
|
||||
colorFilter: resolvedColor != null
|
||||
? ColorFilter.mode(resolvedColor, BlendMode.srcIn)
|
||||
: null,
|
||||
),
|
||||
);
|
||||
}
|
||||
2
packages/core/lib/presentation/widget/widget.dart
Normal file
2
packages/core/lib/presentation/widget/widget.dart
Normal file
@@ -0,0 +1,2 @@
|
||||
export 'vec_widget.dart';
|
||||
export 'bottom_navigation/bottom_navigation_1.dart';
|
||||
890
packages/core/pubspec.lock
Normal file
890
packages/core/pubspec.lock
Normal file
@@ -0,0 +1,890 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: dc27559385e905ad30838356c5f5d574014ba39872d732111cd07ac0beff4c57
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "80.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "192d1c5b944e7e53b24b5586db760db934b177d4147c42fbca8c8c5f1eb8d11e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.3.0"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.7.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.12.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
build:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
build_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_config
|
||||
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
build_daemon:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_daemon
|
||||
sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.4"
|
||||
build_resolvers:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.4"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.15"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_collection
|
||||
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.1"
|
||||
built_value:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.9.5"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: characters
|
||||
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: checked_yaml
|
||||
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: clock
|
||||
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.10.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.19.1"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cupertino_icons
|
||||
sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.8"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.1"
|
||||
dartx:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: dartx
|
||||
sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fake_async
|
||||
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.2"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.1"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_lints:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_lints
|
||||
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.0"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_svg
|
||||
sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.17"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_web_plugins:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
freezed:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: freezed
|
||||
sha256: "6022db4c7bfa626841b2a10f34dd1e1b68e8f8f9650db6112dcdeeca45ca793c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
freezed_annotation:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: freezed_annotation
|
||||
sha256: c87ff004c8aa6af2d531668b46a4ea379f7191dc6dfa066acd53d506da6e044b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
get:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: get
|
||||
sha256: c79eeb4339f1f3deffd9ec912f8a923834bec55f7b49c9e882b8fef2c139d425
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.7.2"
|
||||
get_it:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: get_it
|
||||
sha256: f126a3e286b7f5b578bf436d5592968706c4c1de28a228b870ce375d9f743103
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.3"
|
||||
get_test:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: get_test
|
||||
sha256: "558c39cb35fb37bd501f337dc143de60a4314d5ef3b75f4b0551d6741634995b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.1"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: graphs
|
||||
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
hive_ce:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive_ce
|
||||
sha256: ac66daee46ad46486a1ed12cf91e9d7479c875fb46889be8d2c96b557406647f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.10.1"
|
||||
hive_ce_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive_ce_flutter
|
||||
sha256: "74c1d5f10d803446b4e7913bb272137e2724ba8a56465444f9e7713aeb60a877"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
hive_ce_generator:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: hive_ce_generator
|
||||
sha256: "0b1c750e2d10c55a14cde16d479ada42704be6cef43c54b728ed0e4e02f7d808"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.8.2"
|
||||
http:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http
|
||||
sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.2"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.2"
|
||||
io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: io
|
||||
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.2"
|
||||
json_annotation:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: json_annotation
|
||||
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.9.0"
|
||||
json_serializable:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: json_serializable
|
||||
sha256: "81f04dee10969f89f604e1249382d46b97a1ccad53872875369622b5bfc9e58a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.9.4"
|
||||
leak_tracker:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker
|
||||
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "10.0.8"
|
||||
leak_tracker_flutter_testing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: leak_tracker_flutter_testing
|
||||
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.9"
|
||||
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:
|
||||
name: lints
|
||||
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.1"
|
||||
logger:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: logger
|
||||
sha256: be4b23575aac7ebf01f225a241eb7f6b5641eeaf43c6a8613510fc2f8cf187d1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.17"
|
||||
material_color_utilities:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: material_color_utilities
|
||||
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.11.1"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.16.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
mockito:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mockito
|
||||
sha256: f99d8d072e249f719a5531735d146d8cf04c580d93920b04de75bef6dfb2daf6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.4.5"
|
||||
mocktail:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: mocktail
|
||||
sha256: "890df3f9688106f25755f26b1c60589a92b3ab91a22b8b224947ad041bf172d8"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
path_parsing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_parsing
|
||||
sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
path_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider
|
||||
sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
path_provider_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_android
|
||||
sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.16"
|
||||
path_provider_foundation:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_foundation
|
||||
sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.1"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.0"
|
||||
permission_handler:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: permission_handler
|
||||
sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.4.0"
|
||||
permission_handler_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "12.1.0"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_apple
|
||||
sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.4.6"
|
||||
permission_handler_html:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_html
|
||||
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.1.3+5"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_platform_interface
|
||||
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.3.0"
|
||||
permission_handler_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_windows
|
||||
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.1"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: petitparser
|
||||
sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.0"
|
||||
platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.6"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.8"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
pubspec_parse:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pubspec_parse
|
||||
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
rxdart:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: rxdart
|
||||
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.28.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.2"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_helper
|
||||
sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.5"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
stream_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_transform
|
||||
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.4"
|
||||
time:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: time
|
||||
sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timing
|
||||
sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics
|
||||
sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.18"
|
||||
vector_graphics_codec:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_codec
|
||||
sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.13"
|
||||
vector_graphics_compiler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_graphics_compiler
|
||||
sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.16"
|
||||
vector_math:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vector_math
|
||||
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "14.3.1"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web
|
||||
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.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: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xml
|
||||
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.5.0"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
yaml_writer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml_writer
|
||||
sha256: "69651cd7238411179ac32079937d4aa9a2970150d6b2ae2c6fe6de09402a5dc5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
sdks:
|
||||
dart: ">=3.7.0 <4.0.0"
|
||||
flutter: ">=3.27.0"
|
||||
@@ -56,6 +56,5 @@ dev_dependencies:
|
||||
get_test: ^4.0.1
|
||||
|
||||
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
Reference in New Issue
Block a user