feat: reactive input file forms library (reactive form)

This commit is contained in:
Golek 2022-12-06 16:39:25 +07:00
parent 094c1fd452
commit f50576936e
12 changed files with 1640 additions and 11 deletions

View File

@ -52,6 +52,16 @@ List<Story> getStories(GolekThemeData theme) {
),
),
),
Story(
name: 'Plain Input File',
section: 'Form Input',
builder: (_, k) => InputFile(
allowMultiple: k.boolean(label: 'allowMultiple', initial: false),
onChange: (files) {},
files: [],
inputLabel: '',
),
),
Story.simple(
name: 'Simple Expanded Elevated Button',
section: 'Buttons',

View File

@ -5,6 +5,8 @@
import FlutterMacOS
import Foundation
import path_provider_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
}

View File

@ -50,6 +50,20 @@ packages:
relative: true
source: path
version: "0.0.0"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
crypto:
dependency: transitive
description:
name: crypto
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
device_frame:
dependency: transitive
description:
@ -57,6 +71,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.1"
extended_image:
dependency: transitive
description:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
version: "6.3.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.1"
fake_async:
dependency: transitive
description:
@ -64,6 +92,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
name: file
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
file_picker:
dependency: transitive
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.3"
flutter:
dependency: "direct main"
description: flutter
@ -81,6 +130,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
flutter_svg:
dependency: transitive
description:
@ -93,6 +149,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
freezed_annotation:
dependency: transitive
description:
@ -100,6 +161,62 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.15.0"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_client_helper:
dependency: transitive
description:
name: http_client_helper
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
http_parser:
dependency: transitive
description:
name: http_parser
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
image_picker:
dependency: transitive
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.10"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6+1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.2"
intl:
dependency: transitive
description:
@ -107,6 +224,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.17.0"
js:
dependency: transitive
description:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.4"
json_annotation:
dependency: transitive
description:
@ -170,6 +294,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.22"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
petitparser:
dependency: transitive
description:
@ -177,6 +350,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
provider:
dependency: transitive
description:
@ -245,6 +439,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.12"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
vector_math:
dependency: transitive
description:
@ -252,6 +453,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.2"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
xml:
dependency: transitive
description:
@ -261,4 +476,4 @@ packages:
version: "6.1.0"
sdks:
dart: ">=2.18.0 <3.0.0"
flutter: ">=2.11.0-0.1.pre"
flutter: ">=3.3.0"

View File

@ -5,5 +5,6 @@ export 'src/theme/spacing.dart';
export 'src/theme/golek_theme.dart';
export 'src/theme/golek_theme_data.dart';
export 'src/input_field.dart';
export 'src/input_file.dart';
export 'src/error_message_builder.dart';
export 'src/favorite_icon_button.dart';

View File

@ -0,0 +1,120 @@
import 'package:flutter/material.dart';
import 'dart:math' as math;
class DashedRect extends StatelessWidget {
final Color color;
final double strokeWidth;
final double gap;
final Widget child;
const DashedRect({
Key? key,
this.color = Colors.black,
this.strokeWidth = 1.0,
this.gap = 5.0,
required this.child,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(strokeWidth / 2),
child: CustomPaint(
painter: DashRectPainter(
color: color,
strokeWidth: strokeWidth,
gap: gap,
),
child: child,
),
);
}
}
class DashRectPainter extends CustomPainter {
double strokeWidth;
Color color;
double gap;
DashRectPainter(
{this.strokeWidth = 5.0, this.color = Colors.red, this.gap = 5.0});
@override
void paint(Canvas canvas, Size size) {
Paint dashedPaint = Paint()
..color = color
..strokeWidth = strokeWidth
..style = PaintingStyle.stroke;
double x = size.width;
double y = size.height;
Path _topPath = getDashedPath(
a: const math.Point(0, 0),
b: math.Point(x, 0),
gap: gap,
);
Path _rightPath = getDashedPath(
a: math.Point(x, 0),
b: math.Point(x, y),
gap: gap,
);
Path _bottomPath = getDashedPath(
a: math.Point(0, y),
b: math.Point(x, y),
gap: gap,
);
Path _leftPath = getDashedPath(
a: const math.Point(0, 0),
b: math.Point(0.001, y),
gap: gap,
);
canvas.drawPath(_topPath, dashedPaint);
canvas.drawPath(_rightPath, dashedPaint);
canvas.drawPath(_bottomPath, dashedPaint);
canvas.drawPath(_leftPath, dashedPaint);
}
Path getDashedPath({
required math.Point<double> a,
required math.Point<double> b,
required gap,
}) {
Size size = Size(b.x - a.x, b.y - a.y);
Path path = Path();
path.moveTo(a.x, a.y);
bool shouldDraw = true;
math.Point currentPoint = math.Point(a.x, a.y);
num radians = math.atan(size.height / size.width);
num dx = math.cos(radians) * gap < 0
? math.cos(radians) * gap * -1
: math.cos(radians) * gap;
num dy = math.sin(radians) * gap < 0
? math.sin(radians) * gap * -1
: math.sin(radians) * gap;
while (currentPoint.x <= b.x && currentPoint.y <= b.y) {
shouldDraw
? path.lineTo(currentPoint.x.toDouble(), currentPoint.y.toDouble())
: path.moveTo(currentPoint.x.toDouble(), currentPoint.y.toDouble());
shouldDraw = !shouldDraw;
currentPoint = math.Point(
currentPoint.x + dx,
currentPoint.y + dy,
);
}
return path;
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
}

View File

@ -0,0 +1,390 @@
import 'dart:async';
import 'dart:io';
import 'package:component_library/component_library.dart';
import 'package:extended_image/extended_image.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import '_dashed_rect.dart';
class InputFile extends StatefulWidget {
const InputFile({
Key? key,
this.files = const [],
required this.onChange,
this.allowMultiple = false,
this.allowedExtensions = const ['jpg', 'jpeg', 'png', 'gif'],
required this.inputLabel,
this.isError = false,
this.messageError,
}) : super(key: key);
final List<File> files;
final void Function(List<File> files) onChange;
final bool? allowMultiple;
final List<String>? allowedExtensions;
final String inputLabel;
final bool? isError;
final String? messageError;
@override
State<InputFile> createState() => _InputFileState();
}
class _InputFileState extends State<InputFile> {
List<File> files = [];
StreamController<List<File>> controller = StreamController();
late Stream<List<File>> stream;
void addFileToSink(List<File> addedFile) {
controller.sink.add(files);
files = addedFile;
}
void removeFile(File file) {
final filtered = files.skipWhile((f) => f.hashCode == file.hashCode);
controller.sink.add(filtered.toList());
files = filtered.toList();
}
void close() {
controller.close();
}
@override
void initState() {
super.initState();
// tambahkan initial component file value
files = widget.files;
addFileToSink(files);
// dapatkan stream dan listen ke onchange
stream = controller.stream;
}
@override
void dispose() {
close();
super.dispose();
}
/// ketika user memilih menggunakan camera saat input file
Future<void> pickFileFromCamera(BuildContext modalContext) async {
final imagePicker = ImagePicker();
final result = await imagePicker.pickImage(
source: ImageSource.camera,
preferredCameraDevice: CameraDevice.rear,
imageQuality: 40,
);
if (result != null) {
final pickedFile = File(result.path);
if (widget.allowMultiple == true) {
addFileToSink([...files, pickedFile]);
}
if (widget.allowMultiple == false) {
addFileToSink([pickedFile]);
}
}
}
/// ketika user memilih menggunakan gallery saat input file
Future<void> pickFileFromGallery(BuildContext modalContext) async {
final result = await FilePicker.platform.pickFiles(
allowMultiple: widget.allowMultiple!,
type: FileType.custom,
allowedExtensions: widget.allowedExtensions,
allowCompression: true,
);
for (var file in result?.files ?? []) {
final pickedFile = File(file.path);
if (widget.allowMultiple == true) {
addFileToSink([...files, pickedFile]);
}
if (widget.allowMultiple == false) {
addFileToSink([pickedFile]);
}
}
}
@override
Widget build(BuildContext context) {
final theme = GolekTheme.of(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.transparent,
width: 3,
),
),
width: 335,
child: IntrinsicHeight(
child: DashedRect(
color: widget.isError!
? theme.dangerMainColor // jika error dan touched
: theme.neutral50Color,
strokeWidth: 2.0,
gap: 3.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(height: 21),
OutlinedButton(
onPressed: () => showModalFileToPick(
context: context,
onPickCamera: (context) async {
await pickFileFromCamera(context);
Navigator.of(context).pop();
},
onPickGallery: (context) async {
await pickFileFromGallery(context);
Navigator.of(context).pop();
},
),
style: OutlinedButton.styleFrom(
side: BorderSide(
width: 1,
color: theme.primaryMainColor,
),
backgroundColor: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(6.0),
),
),
child: Text(
'Upload Foto\u{002A}',
style: theme.textStyle.copyWith(
fontSize: FontSize.style14,
color: theme.primaryMainColor,
),
),
),
const SizedBox(height: 10),
StreamBuilder(
stream: stream,
builder: (context, snapshot) {
widget.onChange.call(files);
return ListFilesBuilder(
files: files,
multiple: widget.allowMultiple!,
onRemoveFile: removeFile,
);
},
),
Text(
'Maks. 1 Foto, 1 Foto Maks. 2 mb',
style: theme.textStyle.copyWith(
fontSize: FontSize.style14,
color: theme.primaryMainColor,
),
),
const SizedBox(height: 38),
],
),
),
),
),
ErrorMessageBuilder(
inputLabel: widget.inputLabel,
messageError: widget.messageError ?? '',
)
],
);
}
}
// stateless widget tampilan user files yang telah diinput
class ListFilesBuilder extends StatelessWidget {
final List<File> files;
final bool multiple;
final Function(File file) onRemoveFile;
const ListFilesBuilder({
Key? key,
required this.files,
required this.multiple,
required this.onRemoveFile,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final theme = GolekTheme.of(context);
return Expanded(
child: Wrap(
runSpacing: 4,
spacing: 4,
alignment: WrapAlignment.center,
children: List.generate(files.length, (index) {
var file = files[index];
return Column(children: [
Visibility(
visible: multiple == false,
child: Container(
margin: const EdgeInsets.all(10),
child: ClipRRect(
borderRadius: BorderRadius.circular(6),
child: ExtendedImage.file(
file,
height: 105,
width: 150,
enableMemoryCache: false,
clearMemoryCacheIfFailed: true,
clearMemoryCacheWhenDispose: true,
),
),
),
),
Visibility(
visible: multiple == true,
child: Stack(
children: [
Container(
margin: const EdgeInsets.all(10),
child: ClipRRect(
borderRadius: BorderRadius.circular(6),
child: ExtendedImage.file(
file,
height: 105,
width: 150,
enableMemoryCache: false,
clearMemoryCacheIfFailed: true,
clearMemoryCacheWhenDispose: true,
),
),
),
GestureDetector(
onTap: () => onRemoveFile(file),
child: Container(
decoration: BoxDecoration(
color: theme.dangerMainColor,
borderRadius: BorderRadius.circular(40),
),
child: Icon(
Icons.remove,
color: theme.neutral10Color,
),
),
)
],
),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
((file.path).split('/').last),
textAlign: TextAlign.center,
),
),
]);
}),
),
);
}
}
// modal untuk memilih user akan menggunakan kamera atau gallery
void showModalFileToPick({
required BuildContext context,
required Future<void> Function(BuildContext modalContext) onPickCamera,
required Future<void> Function(BuildContext modalContext) onPickGallery,
}) {
final theme = GolekTheme.of(context);
FocusScope.of(context).requestFocus(FocusNode());
showModalBottomSheet(
context: context,
barrierColor: const Color.fromRGBO(196, 196, 196, 0.3),
isScrollControlled: true,
backgroundColor: Colors.transparent,
builder: (BuildContext modalContext) {
return ConstrainedBox(
constraints: const BoxConstraints(minHeight: 150),
child: Container(
width: double.infinity,
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25.0),
topRight: Radius.circular(25.0),
),
color: Colors.white,
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 10),
Align(
alignment: Alignment.topCenter,
child: Container(
width: 60,
height: 6,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: const Color.fromRGBO(196, 196, 196, 1),
),
),
),
const SizedBox(height: 15),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Column(
children: [
const SizedBox(height: 15),
GestureDetector(
onTap: () => onPickGallery.call(modalContext),
child: Icon(
Icons.folder,
color: theme.primaryMainColor,
size: 50.25,
),
),
Text(
'File',
style: theme.textStyle.copyWith(
fontSize: FontSize.style16,
fontWeight: FontWeight.w600,
),
)
],
),
const SizedBox(width: 107.9),
Column(
children: [
const SizedBox(height: 15),
GestureDetector(
onTap: () => onPickCamera.call(modalContext),
child: Icon(
Icons.camera_alt,
color: theme.primaryMainColor,
size: 50.25,
),
),
Text(
'Kamera',
style: theme.textStyle.copyWith(
fontSize: FontSize.style16,
fontWeight: FontWeight.w600,
),
),
],
)
],
),
const SizedBox(height: 52),
],
),
),
);
},
);
}

View File

@ -78,6 +78,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.1"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
crypto:
dependency: transitive
description:
@ -85,6 +92,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
extended_image:
dependency: "direct main"
description:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
version: "6.3.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.1"
fake_async:
dependency: transitive
description:
@ -92,6 +113,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
@ -99,6 +127,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
file_picker:
dependency: "direct main"
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.3"
flutter:
dependency: "direct main"
description: flutter
@ -116,6 +151,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
flutter_svg:
dependency: "direct main"
description:
@ -128,6 +170,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
frontend_server_client:
dependency: transitive
description:
@ -142,6 +189,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_client_helper:
dependency: transitive
description:
name: http_client_helper
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
http_multi_server:
dependency: transitive
description:
@ -156,6 +217,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
image_picker:
dependency: "direct main"
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.10"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6+1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.2"
intl:
dependency: "direct main"
description:
@ -176,7 +272,7 @@ packages:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.5"
version: "0.6.4"
lints:
dependency: transitive
description:
@ -261,6 +357,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.22"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
petitparser:
dependency: transitive
description:
@ -268,6 +413,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
pool:
dependency: transitive
description:
@ -275,6 +434,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
pub_semver:
dependency: transitive
description:
@ -427,6 +593,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
xml:
dependency: transitive
description:
@ -443,4 +623,4 @@ packages:
version: "3.1.1"
sdks:
dart: ">=2.18.0 <3.0.0"
flutter: ">=2.11.0-0.1.pre"
flutter: ">=3.3.0"

View File

@ -12,6 +12,9 @@ dependencies:
intl: ^0.17.0
flutter_svg: ^1.1.6
auto_size_text: ^3.0.0-nullsafety.0
image_picker: ^0.8.6
file_picker: ^5.2.3
extended_image: ^6.3.4
dev_dependencies:
flutter_test:

View File

@ -92,6 +92,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.1"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
crypto:
dependency: transitive
description:
@ -99,6 +106,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
extended_image:
dependency: transitive
description:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
version: "6.3.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.1"
fake_async:
dependency: transitive
description:
@ -106,6 +127,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
@ -113,6 +141,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
file_picker:
dependency: transitive
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.3"
flutter:
dependency: "direct main"
description: flutter
@ -137,6 +172,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
flutter_svg:
dependency: transitive
description:
@ -149,6 +191,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
form_fields:
dependency: "direct main"
description:
@ -170,6 +217,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_client_helper:
dependency: transitive
description:
name: http_client_helper
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
http_multi_server:
dependency: transitive
description:
@ -184,6 +245,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
image_picker:
dependency: transitive
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.10"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6+1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.2"
intl:
dependency: transitive
description:
@ -204,7 +300,7 @@ packages:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.5"
version: "0.6.4"
lints:
dependency: transitive
description:
@ -296,6 +392,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.22"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
petitparser:
dependency: transitive
description:
@ -303,6 +448,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
pool:
dependency: transitive
description:
@ -310,6 +469,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
provider:
dependency: transitive
description:
@ -476,6 +642,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
xml:
dependency: transitive
description:
@ -492,4 +672,4 @@ packages:
version: "3.1.1"
sdks:
dart: ">=2.18.2 <3.0.0"
flutter: ">=3.0.0"
flutter: ">=3.3.0"

View File

@ -92,6 +92,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.1"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
crypto:
dependency: transitive
description:
@ -99,6 +106,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
extended_image:
dependency: transitive
description:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
version: "6.3.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.1"
fake_async:
dependency: transitive
description:
@ -106,6 +127,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
@ -113,6 +141,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
file_picker:
dependency: transitive
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.3"
flutter:
dependency: "direct main"
description: flutter
@ -137,6 +172,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
flutter_svg:
dependency: transitive
description:
@ -149,6 +191,11 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
form_fields:
dependency: "direct main"
description:
@ -170,6 +217,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_client_helper:
dependency: transitive
description:
name: http_client_helper
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
http_multi_server:
dependency: transitive
description:
@ -184,6 +245,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
image_picker:
dependency: transitive
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.10"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6+1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.2"
intl:
dependency: transitive
description:
@ -204,7 +300,7 @@ packages:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.5"
version: "0.6.4"
lints:
dependency: transitive
description:
@ -296,6 +392,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.22"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
petitparser:
dependency: transitive
description:
@ -303,6 +448,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
pool:
dependency: transitive
description:
@ -310,6 +469,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
provider:
dependency: transitive
description:
@ -476,6 +642,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
xml:
dependency: transitive
description:
@ -492,4 +672,4 @@ packages:
version: "3.1.1"
sdks:
dart: ">=2.18.2 <3.0.0"
flutter: ">=3.0.0"
flutter: ">=3.3.0"

View File

@ -85,6 +85,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.6.1"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
crypto:
dependency: transitive
description:
@ -92,6 +99,27 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
extended_image:
dependency: transitive
description:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
version: "6.3.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
@ -99,6 +127,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
file_picker:
dependency: transitive
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.3"
flutter:
dependency: "direct main"
description: flutter
@ -109,6 +144,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
flutter_svg:
dependency: transitive
description:
@ -116,6 +158,11 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.6"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
frontend_server_client:
dependency: transitive
description:
@ -130,6 +177,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_client_helper:
dependency: transitive
description:
name: http_client_helper
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
http_multi_server:
dependency: transitive
description:
@ -144,6 +205,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
image_picker:
dependency: transitive
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.10"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6+1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.2"
intl:
dependency: transitive
description:
@ -164,7 +260,7 @@ packages:
name: js
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.5"
version: "0.6.4"
lints:
dependency: "direct dev"
description:
@ -242,6 +338,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.22"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
petitparser:
dependency: transitive
description:
@ -249,6 +394,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
pool:
dependency: transitive
description:
@ -256,6 +415,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
pub_semver:
dependency: transitive
description:
@ -415,6 +581,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
xml:
dependency: transitive
description:
@ -431,4 +611,4 @@ packages:
version: "3.1.1"
sdks:
dart: ">=2.18.2 <3.0.0"
flutter: ">=3.0.0"
flutter: ">=3.3.0"

View File

@ -190,6 +190,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.1"
cross_file:
dependency: transitive
description:
name: cross_file
url: "https://pub.dartlang.org"
source: hosted
version: "0.3.3+2"
crypto:
dependency: transitive
description:
@ -218,6 +225,20 @@ packages:
relative: true
source: path
version: "1.0.0"
extended_image:
dependency: transitive
description:
name: extended_image
url: "https://pub.dartlang.org"
source: hosted
version: "6.3.4"
extended_image_library:
dependency: transitive
description:
name: extended_image_library
url: "https://pub.dartlang.org"
source: hosted
version: "3.4.1"
fake_async:
dependency: transitive
description:
@ -225,6 +246,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
@ -232,6 +260,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.4"
file_picker:
dependency: transitive
description:
name: file_picker
url: "https://pub.dartlang.org"
source: hosted
version: "5.2.3"
firebase_analytics:
dependency: transitive
description:
@ -340,6 +375,13 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_plugin_android_lifecycle:
dependency: transitive
description:
name: flutter_plugin_android_lifecycle
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.7"
flutter_svg:
dependency: transitive
description:
@ -385,6 +427,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
http:
dependency: transitive
description:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.13.5"
http_client_helper:
dependency: transitive
description:
name: http_client_helper
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
http_multi_server:
dependency: transitive
description:
@ -399,6 +455,41 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.2"
image_picker:
dependency: transitive
description:
name: image_picker
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6"
image_picker_android:
dependency: transitive
description:
name: image_picker_android
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.5+3"
image_picker_for_web:
dependency: transitive
description:
name: image_picker_for_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.10"
image_picker_ios:
dependency: transitive
description:
name: image_picker_ios
url: "https://pub.dartlang.org"
source: hosted
version: "0.8.6+1"
image_picker_platform_interface:
dependency: transitive
description:
name: image_picker_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.6.2"
intl:
dependency: "direct main"
description:
@ -518,6 +609,55 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_provider:
dependency: transitive
description:
name: path_provider
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.22"
path_provider_ios:
dependency: transitive
description:
name: path_provider_ios
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.11"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.7"
path_provider_macos:
dependency: transitive
description:
name: path_provider_macos
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.6"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.3"
petitparser:
dependency: transitive
description:
@ -525,6 +665,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.0"
platform:
dependency: transitive
description:
name: platform
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
@ -539,6 +686,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.5.1"
process:
dependency: transitive
description:
name: process
url: "https://pub.dartlang.org"
source: hosted
version: "4.2.4"
provider:
dependency: transitive
description:
@ -684,6 +838,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
win32:
dependency: transitive
description:
name: win32
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.2"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
url: "https://pub.dartlang.org"
source: hosted
version: "0.2.0+2"
xml:
dependency: transitive
description:
@ -700,4 +868,4 @@ packages:
version: "3.1.1"
sdks:
dart: ">=2.18.2 <3.0.0"
flutter: ">=3.0.0"
flutter: ">=3.3.0"