#sprint-1

This commit is contained in:
User3 2025-05-26 16:24:19 +03:00
parent 80812e5224
commit bf5cc505ed
11 changed files with 136 additions and 58 deletions

10
assets/closed-eye.svg Normal file
View File

@ -0,0 +1,10 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3061_143)">
<path d="M0.81774 0.139688C0.631697 -0.0465626 0.329771 -0.0465626 0.143754 0.139688C-0.042466 0.325761 -0.042466 0.627736 0.143754 0.813782L4.25512 4.92508C2.55453 6.2446 1.13085 7.88662 0.0656466 9.75702C-0.0218822 9.90711 -0.0218822 10.0927 0.0656466 10.2428C2.2347 13.9064 4.99887 16.2147 8.06376 16.9215C8.69951 17.0683 9.34991 17.1423 10.0025 17.1423C11.7631 17.1175 13.4806 16.5921 14.9539 15.6272L19.1853 19.8603V19.8604C19.3716 20.0465 19.6733 20.0465 19.8595 19.8604C20.0457 19.6742 20.0457 19.3724 19.8595 19.1862L0.81774 0.139688ZM8.0189 8.68937L11.3134 11.9844H11.3136C10.6988 12.3858 9.93336 12.481 9.23919 12.2425C8.54479 12.0039 7.99944 11.4585 7.76094 10.7642C7.52263 10.0697 7.61778 9.3041 8.0191 8.68939L8.0189 8.68937ZM8.28078 15.9928C5.54419 15.3624 3.04365 13.292 1.03562 10H1.03579C2.03405 8.29292 3.35744 6.79833 4.93116 5.60108L7.34384 8.01433C6.69376 8.87292 6.50117 9.9936 6.82698 11.02C7.15299 12.0466 7.95705 12.8508 8.98329 13.1767C10.0095 13.5027 11.1302 13.3099 11.9887 12.6597L14.2664 14.9378H14.2662C12.4882 16.0648 10.337 16.4441 8.28064 15.9929L8.28078 15.9928ZM10.3499 7.65457L9.42146 6.72597C9.61282 6.68734 9.80736 6.66767 10.0025 6.66696C10.8862 6.66696 11.7339 7.01802 12.359 7.64324C12.9839 8.26825 13.3351 9.11605 13.3351 10.0001C13.3344 10.1953 13.3146 10.3898 13.2759 10.5811L12.3475 9.65246H12.3477C12.2729 9.14917 12.0383 8.6833 11.6786 8.32355C11.3189 7.96381 10.8531 7.72915 10.3499 7.65457ZM19.9342 9.75738V9.7572C20.0219 9.9073 20.0219 10.0928 19.9342 10.2429C19.096 11.6863 18.0573 13.0035 16.8493 14.155L16.1742 13.4788V13.479C17.2596 12.452 18.1999 11.2815 18.9687 10.0001C16.5321 6.00597 13.3565 3.80994 10.0022 3.80994C9.00502 3.82004 8.01878 4.02082 7.09709 4.40128L6.35911 3.66318C7.50319 3.14129 8.74453 2.86659 10.0021 2.85757C13.7745 2.85757 17.3013 5.30788 19.9339 9.75729L19.9342 9.75738Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_3061_143">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

11
assets/eye.svg Normal file
View File

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3061_543)">
<path d="M9.99994 6.95547C9.21596 6.95486 8.46385 7.26598 7.9092 7.82004C7.35455 8.3741 7.04279 9.1259 7.04248 9.90988C7.04202 10.6939 7.3533 11.4458 7.90752 12.0004C8.46174 12.5548 9.21354 12.8666 9.99752 12.8668C10.7815 12.8669 11.5335 12.5556 12.0878 12.0013C12.6423 11.447 12.9538 10.6951 12.9538 9.91113C12.9533 9.12758 12.642 8.37641 12.0881 7.82234C11.5344 7.26812 10.7834 6.95641 9.99998 6.95551L9.99994 6.95547ZM9.99994 11.225C9.65067 11.2255 9.31572 11.0872 9.06854 10.8405C8.8215 10.5939 8.68264 10.2591 8.68234 9.91001C8.68218 9.56089 8.82089 9.22594 9.06777 8.97907C9.31466 8.73218 9.64961 8.59348 9.99871 8.59378C10.3478 8.59394 10.6826 8.73279 10.9292 8.97998C11.1759 9.22702 11.3142 9.56209 11.3137 9.91123C11.3132 10.2594 11.1747 10.5935 10.9284 10.8397C10.682 11.086 10.3481 11.2246 9.9999 11.225L9.99994 11.225Z" fill="black"/>
<path d="M17.471 7.50742L18.2254 6.66558C18.4207 6.44708 18.4848 6.14113 18.3932 5.86281C18.3017 5.58434 18.0687 5.37605 17.7818 5.31609C17.4951 5.25612 17.198 5.35378 17.0027 5.57213L16.2738 6.38116V6.38131C15.722 5.93272 15.124 5.5442 14.4899 5.2224L14.9819 4.31131V4.31116C15.0873 4.05908 15.0601 3.77116 14.9094 3.54319C14.7588 3.31507 14.5046 3.17713 14.2313 3.17515C13.958 3.17316 13.7018 3.30744 13.5479 3.53312L12.9665 4.6046C12.2679 4.39266 11.548 4.25823 10.82 4.20374V3.16874C10.82 2.87577 10.6636 2.60507 10.41 2.45859C10.1563 2.3121 9.84363 2.3121 9.59004 2.45859C9.33628 2.60507 9.18004 2.87577 9.18004 3.16874V4.20191C8.45187 4.25638 7.73215 4.39081 7.03344 4.60277L6.45207 3.53312C6.31276 3.2754 6.04648 3.11152 5.75351 3.10312C5.4607 3.09488 5.18558 3.24365 5.03191 3.49313C4.87841 3.74277 4.86956 4.05528 5.00887 4.31298L5.50083 5.22407C4.86684 5.54603 4.26868 5.93454 3.71692 6.38313L2.98801 5.57411V5.57396C2.7927 5.35561 2.49575 5.25795 2.20891 5.31792C1.9222 5.37788 1.68903 5.58616 1.59766 5.86463C1.50611 6.14295 1.57004 6.44889 1.76536 6.66741L2.52891 7.50741C1.95899 8.12295 1.46903 8.80807 1.0711 9.54643C0.95742 9.77608 0.95742 10.0457 1.0711 10.2753C1.18219 10.4958 3.82989 15.6492 10 15.6492C16.1699 15.6493 18.8234 10.496 18.9289 10.2753C19.0426 10.0457 19.0426 9.77608 18.9289 9.54643C18.5309 8.80807 18.0411 8.12295 17.4711 7.50741L17.471 7.50742ZM9.9999 14.0094C5.68311 14.0094 3.41631 10.9881 2.74561 9.91132C3.41807 8.84703 5.71221 5.80937 9.9999 5.80937C11.0334 5.80235 12.0591 5.98775 13.0248 6.35609L13.0978 6.38524H13.0976C14.0679 6.77464 14.9571 7.34121 15.7198 8.05621C15.7453 8.08536 15.7708 8.11633 15.7999 8.14365C15.8291 8.17096 15.8401 8.17279 15.8582 8.18744L15.8584 8.18729C16.3914 8.70365 16.86 9.2824 17.2541 9.91123C16.5818 10.9735 14.2876 14.0093 9.9998 14.0093L9.9999 14.0094Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_3061_543">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,10 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3061_143)">
<path d="M0.81774 0.139688C0.631697 -0.0465626 0.329771 -0.0465626 0.143754 0.139688C-0.042466 0.325761 -0.042466 0.627736 0.143754 0.813782L4.25512 4.92508C2.55453 6.2446 1.13085 7.88662 0.0656466 9.75702C-0.0218822 9.90711 -0.0218822 10.0927 0.0656466 10.2428C2.2347 13.9064 4.99887 16.2147 8.06376 16.9215C8.69951 17.0683 9.34991 17.1423 10.0025 17.1423C11.7631 17.1175 13.4806 16.5921 14.9539 15.6272L19.1853 19.8603V19.8604C19.3716 20.0465 19.6733 20.0465 19.8595 19.8604C20.0457 19.6742 20.0457 19.3724 19.8595 19.1862L0.81774 0.139688ZM8.0189 8.68937L11.3134 11.9844H11.3136C10.6988 12.3858 9.93336 12.481 9.23919 12.2425C8.54479 12.0039 7.99944 11.4585 7.76094 10.7642C7.52263 10.0697 7.61778 9.3041 8.0191 8.68939L8.0189 8.68937ZM8.28078 15.9928C5.54419 15.3624 3.04365 13.292 1.03562 10H1.03579C2.03405 8.29292 3.35744 6.79833 4.93116 5.60108L7.34384 8.01433C6.69376 8.87292 6.50117 9.9936 6.82698 11.02C7.15299 12.0466 7.95705 12.8508 8.98329 13.1767C10.0095 13.5027 11.1302 13.3099 11.9887 12.6597L14.2664 14.9378H14.2662C12.4882 16.0648 10.337 16.4441 8.28064 15.9929L8.28078 15.9928ZM10.3499 7.65457L9.42146 6.72597C9.61282 6.68734 9.80736 6.66767 10.0025 6.66696C10.8862 6.66696 11.7339 7.01802 12.359 7.64324C12.9839 8.26825 13.3351 9.11605 13.3351 10.0001C13.3344 10.1953 13.3146 10.3898 13.2759 10.5811L12.3475 9.65246H12.3477C12.2729 9.14917 12.0383 8.6833 11.6786 8.32355C11.3189 7.96381 10.8531 7.72915 10.3499 7.65457ZM19.9342 9.75738V9.7572C20.0219 9.9073 20.0219 10.0928 19.9342 10.2429C19.096 11.6863 18.0573 13.0035 16.8493 14.155L16.1742 13.4788V13.479C17.2596 12.452 18.1999 11.2815 18.9687 10.0001C16.5321 6.00597 13.3565 3.80994 10.0022 3.80994C9.00502 3.82004 8.01878 4.02082 7.09709 4.40128L6.35911 3.66318C7.50319 3.14129 8.74453 2.86659 10.0021 2.85757C13.7745 2.85757 17.3013 5.30788 19.9339 9.75729L19.9342 9.75738Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_3061_143">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

11
example/assets/eye.svg Normal file
View File

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3061_543)">
<path d="M9.99994 6.95547C9.21596 6.95486 8.46385 7.26598 7.9092 7.82004C7.35455 8.3741 7.04279 9.1259 7.04248 9.90988C7.04202 10.6939 7.3533 11.4458 7.90752 12.0004C8.46174 12.5548 9.21354 12.8666 9.99752 12.8668C10.7815 12.8669 11.5335 12.5556 12.0878 12.0013C12.6423 11.447 12.9538 10.6951 12.9538 9.91113C12.9533 9.12758 12.642 8.37641 12.0881 7.82234C11.5344 7.26812 10.7834 6.95641 9.99998 6.95551L9.99994 6.95547ZM9.99994 11.225C9.65067 11.2255 9.31572 11.0872 9.06854 10.8405C8.8215 10.5939 8.68264 10.2591 8.68234 9.91001C8.68218 9.56089 8.82089 9.22594 9.06777 8.97907C9.31466 8.73218 9.64961 8.59348 9.99871 8.59378C10.3478 8.59394 10.6826 8.73279 10.9292 8.97998C11.1759 9.22702 11.3142 9.56209 11.3137 9.91123C11.3132 10.2594 11.1747 10.5935 10.9284 10.8397C10.682 11.086 10.3481 11.2246 9.9999 11.225L9.99994 11.225Z" fill="black"/>
<path d="M17.471 7.50742L18.2254 6.66558C18.4207 6.44708 18.4848 6.14113 18.3932 5.86281C18.3017 5.58434 18.0687 5.37605 17.7818 5.31609C17.4951 5.25612 17.198 5.35378 17.0027 5.57213L16.2738 6.38116V6.38131C15.722 5.93272 15.124 5.5442 14.4899 5.2224L14.9819 4.31131V4.31116C15.0873 4.05908 15.0601 3.77116 14.9094 3.54319C14.7588 3.31507 14.5046 3.17713 14.2313 3.17515C13.958 3.17316 13.7018 3.30744 13.5479 3.53312L12.9665 4.6046C12.2679 4.39266 11.548 4.25823 10.82 4.20374V3.16874C10.82 2.87577 10.6636 2.60507 10.41 2.45859C10.1563 2.3121 9.84363 2.3121 9.59004 2.45859C9.33628 2.60507 9.18004 2.87577 9.18004 3.16874V4.20191C8.45187 4.25638 7.73215 4.39081 7.03344 4.60277L6.45207 3.53312C6.31276 3.2754 6.04648 3.11152 5.75351 3.10312C5.4607 3.09488 5.18558 3.24365 5.03191 3.49313C4.87841 3.74277 4.86956 4.05528 5.00887 4.31298L5.50083 5.22407C4.86684 5.54603 4.26868 5.93454 3.71692 6.38313L2.98801 5.57411V5.57396C2.7927 5.35561 2.49575 5.25795 2.20891 5.31792C1.9222 5.37788 1.68903 5.58616 1.59766 5.86463C1.50611 6.14295 1.57004 6.44889 1.76536 6.66741L2.52891 7.50741C1.95899 8.12295 1.46903 8.80807 1.0711 9.54643C0.95742 9.77608 0.95742 10.0457 1.0711 10.2753C1.18219 10.4958 3.82989 15.6492 10 15.6492C16.1699 15.6493 18.8234 10.496 18.9289 10.2753C19.0426 10.0457 19.0426 9.77608 18.9289 9.54643C18.5309 8.80807 18.0411 8.12295 17.4711 7.50741L17.471 7.50742ZM9.9999 14.0094C5.68311 14.0094 3.41631 10.9881 2.74561 9.91132C3.41807 8.84703 5.71221 5.80937 9.9999 5.80937C11.0334 5.80235 12.0591 5.98775 13.0248 6.35609L13.0978 6.38524H13.0976C14.0679 6.77464 14.9571 7.34121 15.7198 8.05621C15.7453 8.08536 15.7708 8.11633 15.7999 8.14365C15.8291 8.17096 15.8401 8.17279 15.8582 8.18744L15.8584 8.18729C16.3914 8.70365 16.86 9.2824 17.2541 9.91123C16.5818 10.9735 14.2876 14.0093 9.9998 14.0093L9.9999 14.0094Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_3061_543">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -11,13 +11,15 @@ class InputsSection extends StatefulWidget {
class _InputsSectionState extends State<InputsSection> { class _InputsSectionState extends State<InputsSection> {
static final inputsList = [ static final inputsList = [
{"initText": ""}, {"initText": ""},
{"initText": "Ivan"}, {"initText": "Введите имя"},
{"initText": "", 'label': "Name"}, {"initText": "", 'label': "Введите имя"},
{"initText": "", 'isError': "true"}, {"initText": "", 'isError': "true"},
{'label': "Name"}, {'label': "Введите имя"},
{"initText": "Enter Name", 'label': "Name"}, {"initText": "Введите имя", 'label': "Введите имя"},
{"initText": "*********", 'isPassword': "true"}, {"initText": "*********", 'isPassword': "true"},
{'isMask': 'true', 'initText': ""},
]; ];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Container(
@ -33,10 +35,13 @@ class _InputsSectionState extends State<InputsSection> {
child: InputWidget( child: InputWidget(
controller: TextEditingController(text: currentItem['initText']), controller: TextEditingController(text: currentItem['initText']),
label: currentItem['label'], label: currentItem['label'],
hintText: 'Введите имя', hintText: currentItem['isMask'] == 'true'
? '--.--.----'
: 'Введите имя',
isError: currentItem['isError'] ?? "", isError: currentItem['isError'] ?? "",
errorText: 'Enter your name', errorText: 'Введите имя',
isPassword: currentItem['isPassword'], isPassword: currentItem['isPassword'],
isMask: currentItem['isMask'],
), ),
); );
}, },

View File

@ -24,7 +24,7 @@ class _SearchSectionState extends State<SearchSection> {
margin: EdgeInsets.only(bottom: height(context) * 3), margin: EdgeInsets.only(bottom: height(context) * 3),
child: SearchWidget( child: SearchWidget(
controller: controller, controller: controller,
hintText: 'Search', hintText: 'Искать описание',
isClosable: currentValue, isClosable: currentValue,
), ),
); );

View File

@ -147,6 +147,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.1" version: "5.1.1"
mask_text_input_formatter:
dependency: "direct main"
description:
name: mask_text_input_formatter
sha256: "978c58ec721c25621ceb468e633f4eef64b64d45424ac4540e0565d4f7c800cd"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:

View File

@ -11,6 +11,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
flutter_advanced_switch: ^3.1.0 flutter_advanced_switch: ^3.1.0
mask_text_input_formatter: ^2.9.0
modal_bottom_sheet: ^3.0.0 modal_bottom_sheet: ^3.0.0
ui_kit: ui_kit:
path: .. path: ..

View File

@ -1,4 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:mask_text_input_formatter/mask_text_input_formatter.dart';
import 'package:ui_kit/ui_kit.dart'; import 'package:ui_kit/ui_kit.dart';
class InputWidget extends StatefulWidget { class InputWidget extends StatefulWidget {
@ -10,6 +12,7 @@ class InputWidget extends StatefulWidget {
this.isError = 'false', this.isError = 'false',
this.errorText, this.errorText,
this.isPassword = 'false', this.isPassword = 'false',
this.isMask = 'false',
}); });
final TextEditingController controller; final TextEditingController controller;
final String? label; final String? label;
@ -17,6 +20,7 @@ class InputWidget extends StatefulWidget {
final String isError; final String isError;
final String? errorText; final String? errorText;
final String? isPassword; final String? isPassword;
final String? isMask;
@override @override
State<InputWidget> createState() => _InputWidgetState(); State<InputWidget> createState() => _InputWidgetState();
@ -30,6 +34,12 @@ class _InputWidgetState extends State<InputWidget> {
widget.isPassword == 'true' ? obscureText = true : obscureText = false; widget.isPassword == 'true' ? obscureText = true : obscureText = false;
} }
var maskFormatter = MaskTextInputFormatter(
mask: '+# (###) ###-##-##',
filter: {"#": RegExp(r'[0-9]')},
type: MaskAutoCompletionType.lazy,
);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
@ -51,6 +61,8 @@ class _InputWidgetState extends State<InputWidget> {
height: 48, height: 48,
child: TextFormField( child: TextFormField(
controller: widget.controller, controller: widget.controller,
obscureText: obscureText,
inputFormatters: widget.isMask == 'true' ? [maskFormatter] : [],
decoration: InputDecoration( decoration: InputDecoration(
fillColor: widget.isError == 'true' ? errorBgColor : inputBgColor, fillColor: widget.isError == 'true' ? errorBgColor : inputBgColor,
filled: true, filled: true,
@ -59,13 +71,19 @@ class _InputWidgetState extends State<InputWidget> {
vertical: 14, vertical: 14,
), ),
hintText: widget.hintText, hintText: widget.hintText,
suffix: widget.isPassword == 'true' suffixIcon: widget.isPassword == 'true'
? Image.asset( ? IconButton(
width: 20, onPressed: () {
height: 20, setState(() {
obscureText == true obscureText = !obscureText;
? 'assets/hidden.png' });
: 'assets/hidden.png', },
icon: SvgPicture.asset(
fit: BoxFit.none,
obscureText != true
? 'assets/eye.svg'
: 'assets/closed-eye.svg',
),
) )
: null, : null,
hintStyle: textRegular.copyWith(color: captionColor), hintStyle: textRegular.copyWith(color: captionColor),

View File

@ -19,54 +19,57 @@ class _TabBarWidgetState extends State<TabBarWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BottomNavigationBar( return SizedBox(
showSelectedLabels: true, height: 51,
showUnselectedLabels: true, child: BottomNavigationBar(
selectedLabelStyle: caption2Regular, showSelectedLabels: true,
unselectedLabelStyle: caption2Regular, showUnselectedLabels: true,
type: BottomNavigationBarType.fixed, selectedLabelStyle: caption2Regular,
unselectedItemColor: iconsColor, unselectedLabelStyle: caption2Regular,
items: <BottomNavigationBarItem>[ type: BottomNavigationBarType.fixed,
BottomNavigationBarItem( unselectedItemColor: iconsColor,
icon: Image.asset('assets/home.png', width: 18, height: 20), items: <BottomNavigationBarItem>[
label: 'Главная', BottomNavigationBarItem(
activeIcon: Image.asset( icon: Image.asset('assets/home.png', width: 18, height: 20),
'assets/home-active.png', label: 'Главная',
width: 18, activeIcon: Image.asset(
height: 20, 'assets/home-active.png',
width: 18,
height: 20,
),
), ),
), BottomNavigationBarItem(
BottomNavigationBarItem( icon: Image.asset('assets/results.png', width: 18, height: 20),
icon: Image.asset('assets/results.png', width: 18, height: 20), label: 'Каталог',
label: 'Каталог', activeIcon: Image.asset(
activeIcon: Image.asset( 'assets/results-active.png',
'assets/results-active.png', width: 18,
width: 18, height: 20,
height: 20, ),
), ),
), BottomNavigationBarItem(
BottomNavigationBarItem( icon: Image.asset('assets/projects.png', width: 18, height: 20),
icon: Image.asset('assets/projects.png', width: 18, height: 20), label: 'Проекты',
label: 'Проекты', activeIcon: Image.asset(
activeIcon: Image.asset( 'assets/projects-active.png',
'assets/projects-active.png', width: 18,
width: 18, height: 20,
height: 20, ),
), ),
), BottomNavigationBarItem(
BottomNavigationBarItem( icon: Image.asset('assets/profile.png', width: 18, height: 20),
icon: Image.asset('assets/profile.png', width: 18, height: 20), label: 'Профиль',
label: 'Профиль', activeIcon: Image.asset(
activeIcon: Image.asset( 'assets/profile-active.png',
'assets/profile-active.png', width: 18,
width: 18, height: 20,
height: 20, ),
), ),
), ],
], currentIndex: _selectedIndex,
currentIndex: _selectedIndex, selectedItemColor: primaryColor,
selectedItemColor: primaryColor, onTap: _onItemTapped,
onTap: _onItemTapped, ),
); );
} }
} }

View File

@ -13,6 +13,7 @@ dependencies:
sdk: flutter sdk: flutter
flutter_advanced_switch: ^3.1.0 flutter_advanced_switch: ^3.1.0
flutter_svg: ^2.1.0 flutter_svg: ^2.1.0
mask_text_input_formatter: ^2.9.0
modal_bottom_sheet: ^3.0.0 modal_bottom_sheet: ^3.0.0
dev_dependencies: dev_dependencies: