wip: select option; lanjut syarat ketentuan dulu
This commit is contained in:
parent
abbd0d8cc8
commit
5e8cdba2de
|
@ -69,14 +69,43 @@ List<Story> getStories(GolekThemeData theme) {
|
||||||
),
|
),
|
||||||
descriptionLabel: k.text(
|
descriptionLabel: k.text(
|
||||||
label: 'descriptionLabel',
|
label: 'descriptionLabel',
|
||||||
initial: 'Maks. 1 Foto, 1 Foto Maks. 2 mb',
|
|
||||||
),
|
|
||||||
guidanceLabel: k.text(
|
|
||||||
label: 'guidanceLabel',
|
|
||||||
initial:
|
initial:
|
||||||
'Tingkatkan kepercayaan partner bisnis dengan mengunggah foto tentang usaha'
|
'Tingkatkan kepercayaan partner bisnis dengan mengunggah foto tentang usaha'
|
||||||
' anda (Contoh foto kantor, armada karyawan dll.)',
|
' anda (Contoh foto kantor, armada karyawan dll.)',
|
||||||
),
|
),
|
||||||
|
guidanceLabel: k.text(
|
||||||
|
label: 'guidanceLabel',
|
||||||
|
initial: 'Maks. 1 Foto, 1 Foto Maks. 2 mb',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Story(
|
||||||
|
name: 'Plain Combo Box',
|
||||||
|
section: 'Form Input',
|
||||||
|
builder: (_, kb) {
|
||||||
|
return ComboBoxField(
|
||||||
|
label: 'Label',
|
||||||
|
items: const [
|
||||||
|
DropdownMenuItem(child: Text('Budi'), value: 'Budi'),
|
||||||
|
DropdownMenuItem(child: Text('Bakti'), value: 'Bakti'),
|
||||||
|
DropdownMenuItem(child: Text('Riyanto'), value: 'Riyanto'),
|
||||||
|
],
|
||||||
|
placeholder: 'Ini placeholder',
|
||||||
|
onChangeComboBox: (value) {
|
||||||
|
print(value);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
Story.simple(
|
||||||
|
name: 'Autocomplete Plain',
|
||||||
|
child: SelectOption(
|
||||||
|
placeholder: 'Ini Placeholder',
|
||||||
|
suggestions: {
|
||||||
|
'Guru': 'guru',
|
||||||
|
'Teka': 'teka'
|
||||||
|
},
|
||||||
|
label: 'Ini Label',
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
|
@ -118,6 +118,48 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_keyboard_visibility:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.4.0"
|
||||||
|
flutter_keyboard_visibility_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -149,6 +191,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_typeahead:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_typeahead
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -266,6 +315,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.0"
|
version: "1.8.0"
|
||||||
|
mime:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: mime
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.3"
|
||||||
nested:
|
nested:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -5,4 +5,6 @@ export 'src/theme/golek_theme.dart';
|
||||||
export 'src/theme/golek_theme_data.dart';
|
export 'src/theme/golek_theme_data.dart';
|
||||||
export 'src/input_field.dart';
|
export 'src/input_field.dart';
|
||||||
export 'src/input_file.dart';
|
export 'src/input_file.dart';
|
||||||
|
export 'src/combo_box.dart';
|
||||||
|
export 'src/auto_complete.dart';
|
||||||
export 'src/error_message_builder.dart';
|
export 'src/error_message_builder.dart';
|
||||||
|
|
|
@ -0,0 +1,278 @@
|
||||||
|
import 'package:component_library/component_library.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||||
|
|
||||||
|
class SelectOption extends StatelessWidget {
|
||||||
|
const SelectOption({
|
||||||
|
Key? key,
|
||||||
|
required this.placeholder,
|
||||||
|
required this.suggestions,
|
||||||
|
required this.label,
|
||||||
|
this.prefixIcon,
|
||||||
|
this.messagesError,
|
||||||
|
this.isDisabled = false,
|
||||||
|
this.isTouched = false,
|
||||||
|
this.isError = false,
|
||||||
|
this.suggestionsCallback,
|
||||||
|
this.changeCallback,
|
||||||
|
this.messageError,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final String label;
|
||||||
|
final String placeholder;
|
||||||
|
final Map<String, String> suggestions;
|
||||||
|
final bool? isDisabled;
|
||||||
|
final bool? isTouched;
|
||||||
|
final bool? isError;
|
||||||
|
final Map<String, String>? messagesError;
|
||||||
|
final Future<void> Function()? suggestionsCallback;
|
||||||
|
final Function()? changeCallback;
|
||||||
|
final Widget? prefixIcon;
|
||||||
|
final String? messageError;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = GolekTheme.of(context);
|
||||||
|
|
||||||
|
if (isDisabled == true) {
|
||||||
|
return Container(
|
||||||
|
height: 52,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(color: Colors.transparent, width: 3),
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
),
|
||||||
|
child: TextFormField(
|
||||||
|
decoration: InputDecoration(
|
||||||
|
hintText: placeholder,
|
||||||
|
hintStyle: theme.textStyle.copyWith(
|
||||||
|
fontSize: FontSize.style14,
|
||||||
|
color: theme.neutral70Color,
|
||||||
|
),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 9.5,
|
||||||
|
vertical: 11,
|
||||||
|
),
|
||||||
|
prefix: const Padding(
|
||||||
|
padding: EdgeInsets.only(left: 14),
|
||||||
|
),
|
||||||
|
prefixIcon: prefixIcon != null
|
||||||
|
? Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 12),
|
||||||
|
child: prefixIcon,
|
||||||
|
)
|
||||||
|
: prefixIcon,
|
||||||
|
filled: true,
|
||||||
|
disabledBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
borderSide: BorderSide(color: theme.neutral50Color),
|
||||||
|
),
|
||||||
|
fillColor: const Color(0xffededed),
|
||||||
|
suffixIcon: Icon(
|
||||||
|
Icons.keyboard_arrow_down,
|
||||||
|
color: theme.neutral90Color,
|
||||||
|
)),
|
||||||
|
enabled: false,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
ReactiveTypeAheadBuilder(
|
||||||
|
isDisabled: isDisabled!,
|
||||||
|
context: context,
|
||||||
|
hasValue: true,
|
||||||
|
suggestions: suggestions,
|
||||||
|
placeholder: placeholder,
|
||||||
|
changeCallback: changeCallback,
|
||||||
|
prefixIcon: prefixIcon,
|
||||||
|
suggestionsCallback: suggestionsCallback,
|
||||||
|
isTouched: isTouched!,
|
||||||
|
isError: isError!,
|
||||||
|
),
|
||||||
|
ErrorMessageBuilder(
|
||||||
|
inputLabel: label,
|
||||||
|
messageError: messageError ?? '',
|
||||||
|
)
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// widget yang ditampilkan saat tidak ada suggestion
|
||||||
|
class ListTileNoSuggestionBuilder extends StatelessWidget {
|
||||||
|
const ListTileNoSuggestionBuilder({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = GolekTheme.of(context);
|
||||||
|
|
||||||
|
return ListTile(
|
||||||
|
tileColor: Colors.white,
|
||||||
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||||
|
title: Text(
|
||||||
|
'Tidak ditemukan data',
|
||||||
|
style: theme.textStyle.copyWith(
|
||||||
|
fontSize: FontSize.style14,
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// widget yang ditampilkan saat tidak ada suggestion
|
||||||
|
class ListTileSuggestionBuilder extends StatelessWidget {
|
||||||
|
const ListTileSuggestionBuilder({
|
||||||
|
Key? key,
|
||||||
|
required this.isTileSelected,
|
||||||
|
required this.suggestion,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final bool isTileSelected;
|
||||||
|
final String suggestion;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = GolekTheme.of(context);
|
||||||
|
|
||||||
|
return ListTile(
|
||||||
|
tileColor: isTileSelected ? theme.primarySurfaceColor : Colors.white,
|
||||||
|
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||||
|
trailing: isTileSelected
|
||||||
|
? Icon(
|
||||||
|
Icons.check,
|
||||||
|
color: theme.primaryMainColor,
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
title: Text(
|
||||||
|
suggestion,
|
||||||
|
style: theme.textStyle.copyWith(
|
||||||
|
fontSize: FontSize.style14,
|
||||||
|
color: isTileSelected ? theme.primaryMainColor : Colors.black,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ReactiveTypeAheadBuilder extends StatefulWidget {
|
||||||
|
const ReactiveTypeAheadBuilder({
|
||||||
|
Key? key,
|
||||||
|
required this.isDisabled,
|
||||||
|
required this.isTouched,
|
||||||
|
required this.isError,
|
||||||
|
required this.context,
|
||||||
|
required this.hasValue,
|
||||||
|
required this.suggestions,
|
||||||
|
this.suggestionsCallback,
|
||||||
|
this.changeCallback,
|
||||||
|
this.prefixIcon,
|
||||||
|
required this.placeholder,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final bool isDisabled;
|
||||||
|
final bool isTouched;
|
||||||
|
final bool isError;
|
||||||
|
final BuildContext context;
|
||||||
|
final bool hasValue;
|
||||||
|
final String placeholder;
|
||||||
|
final Map<String, String> suggestions;
|
||||||
|
final Future<void> Function()? suggestionsCallback;
|
||||||
|
final Function()? changeCallback;
|
||||||
|
final Widget? prefixIcon;
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<ReactiveTypeAheadBuilder> createState() =>
|
||||||
|
_ReactiveTypeAheadBuilderState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ReactiveTypeAheadBuilderState extends State<ReactiveTypeAheadBuilder> {
|
||||||
|
final TextEditingController textEditingController = TextEditingController();
|
||||||
|
String keySelected = '';
|
||||||
|
|
||||||
|
/// fungsi untuk mendapatkan suggestion yang tampil
|
||||||
|
List<String> _getSuggestions(String query) {
|
||||||
|
List<String> matches = [];
|
||||||
|
|
||||||
|
/// menambahkan semua properti suggestion di list typehead
|
||||||
|
matches.addAll(widget.suggestions.keys.toList());
|
||||||
|
|
||||||
|
/// filter saat user typing untuk mendapatkan suggestion
|
||||||
|
matches.retainWhere((s) => s.toLowerCase().contains(query.toLowerCase()));
|
||||||
|
return matches;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = GolekTheme.of(context);
|
||||||
|
|
||||||
|
return Container(
|
||||||
|
height: 52,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(color: Colors.transparent, width: 3),
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
),
|
||||||
|
child: TypeAheadField(
|
||||||
|
onSuggestionSelected: (suggestion) {
|
||||||
|
keySelected = suggestion.toString();
|
||||||
|
},
|
||||||
|
noItemsFoundBuilder: (_) => const ListTileNoSuggestionBuilder(),
|
||||||
|
textFieldConfiguration: TextFieldConfiguration(
|
||||||
|
decoration: InputDecoration(
|
||||||
|
prefixIcon: widget.prefixIcon != null
|
||||||
|
? Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 12),
|
||||||
|
child: widget.prefixIcon,
|
||||||
|
)
|
||||||
|
: widget.prefixIcon,
|
||||||
|
fillColor: widget.isDisabled ? theme.neutral30Color : Colors.white,
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 9.5,
|
||||||
|
vertical: 10,
|
||||||
|
),
|
||||||
|
label: Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 12),
|
||||||
|
child: Text(
|
||||||
|
widget.placeholder,
|
||||||
|
style: theme.textStyle.copyWith(
|
||||||
|
fontSize: FontSize.style14,
|
||||||
|
color: widget.isError&& widget.isTouched? theme.dangerMainColor
|
||||||
|
: theme.neutral70Color,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
floatingLabelBehavior: FloatingLabelBehavior.never,
|
||||||
|
suffixIcon: IconButton(
|
||||||
|
icon: Icon(
|
||||||
|
widget.hasValue ? Icons.cancel : Icons.keyboard_arrow_down,
|
||||||
|
color: widget.isError && widget.isTouched
|
||||||
|
? theme.dangerMainColor
|
||||||
|
: theme.neutral90Color,
|
||||||
|
),
|
||||||
|
onPressed: widget.hasValue ? () {} : null,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
suggestionsCallback: (pattern) async {
|
||||||
|
await widget.suggestionsCallback?.call();
|
||||||
|
return _getSuggestions(pattern);
|
||||||
|
},
|
||||||
|
itemBuilder: (context, suggestion) {
|
||||||
|
var isTileSelected = false;
|
||||||
|
|
||||||
|
if (keySelected.isNotEmpty) {
|
||||||
|
isTileSelected = suggestion == keySelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ListTileSuggestionBuilder(
|
||||||
|
isTileSelected: isTileSelected,
|
||||||
|
suggestion: suggestion.toString(),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,157 @@
|
||||||
|
import 'package:component_library/component_library.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ComboBoxField extends StatefulWidget {
|
||||||
|
final String label;
|
||||||
|
final String placeholder;
|
||||||
|
final double? height;
|
||||||
|
final InputDecoration? decoration;
|
||||||
|
final Widget? suffixIcon;
|
||||||
|
final Widget? suffix;
|
||||||
|
final Widget? prefix;
|
||||||
|
final Widget? prefixIcon;
|
||||||
|
final List<DropdownMenuItem<String>> items;
|
||||||
|
final bool? isDisabled;
|
||||||
|
final bool? isTouched;
|
||||||
|
final bool? isError;
|
||||||
|
final void Function(String? value)? onChangeComboBox;
|
||||||
|
|
||||||
|
const ComboBoxField({
|
||||||
|
Key? key,
|
||||||
|
required this.label,
|
||||||
|
required this.items,
|
||||||
|
this.height,
|
||||||
|
this.decoration = const InputDecoration(),
|
||||||
|
required this.placeholder,
|
||||||
|
this.suffixIcon,
|
||||||
|
this.suffix,
|
||||||
|
this.prefix,
|
||||||
|
this.prefixIcon,
|
||||||
|
this.isDisabled = false,
|
||||||
|
this.isTouched = false,
|
||||||
|
this.isError = false,
|
||||||
|
this.onChangeComboBox,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<ComboBoxField> createState() => _ComboBoxFieldState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ComboBoxFieldState extends State<ComboBoxField> {
|
||||||
|
String? _dropDownValue;
|
||||||
|
bool _hasFocus = false;
|
||||||
|
final _dropDownKey = GlobalKey();
|
||||||
|
|
||||||
|
void onTapComboBox() {
|
||||||
|
GestureDetector? detector;
|
||||||
|
void searchForGestureDetector(BuildContext? element) {
|
||||||
|
element?.visitChildElements((element) {
|
||||||
|
if (element.widget is GestureDetector) {
|
||||||
|
detector = element.widget as GestureDetector?;
|
||||||
|
} else {
|
||||||
|
searchForGestureDetector(element);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
searchForGestureDetector(_dropDownKey.currentContext);
|
||||||
|
assert(detector != null);
|
||||||
|
detector!.onTap!();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final theme = GolekTheme.of(context);
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
widget.label,
|
||||||
|
style: theme.textStyle.copyWith(
|
||||||
|
fontSize: FontSize.style13,
|
||||||
|
color: theme.neutral100Color,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: onTapComboBox,
|
||||||
|
child: Focus(
|
||||||
|
onFocusChange: (value) {
|
||||||
|
setState(() => _hasFocus = value);
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
height: widget.height ?? 52,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border.all(
|
||||||
|
color: _hasFocus
|
||||||
|
? theme.successBorderColor
|
||||||
|
: Colors.transparent,
|
||||||
|
width: 3),
|
||||||
|
borderRadius: BorderRadius.circular(8.0),
|
||||||
|
),
|
||||||
|
child: InputDecorator(
|
||||||
|
decoration: widget.decoration!.copyWith(
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 9.5,
|
||||||
|
vertical: 10,
|
||||||
|
),
|
||||||
|
counterText: '',
|
||||||
|
prefixIcon: widget.prefixIcon != null
|
||||||
|
? Padding(
|
||||||
|
padding: const EdgeInsetsDirectional.only(
|
||||||
|
bottom: 0,
|
||||||
|
),
|
||||||
|
child: widget.prefixIcon,
|
||||||
|
)
|
||||||
|
: null,
|
||||||
|
fillColor: widget.isDisabled!
|
||||||
|
? const Color(0xffededed)
|
||||||
|
: Colors.transparent,
|
||||||
|
filled: true,
|
||||||
|
prefix: widget.prefix,
|
||||||
|
suffixIcon: widget.suffixIcon,
|
||||||
|
suffix: widget.suffix,
|
||||||
|
errorStyle: theme.textStyle.copyWith(
|
||||||
|
fontSize: 0,
|
||||||
|
),
|
||||||
|
prefixIconConstraints: const BoxConstraints(
|
||||||
|
minHeight: 24,
|
||||||
|
minWidth: 40,
|
||||||
|
),
|
||||||
|
focusedErrorBorder: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(6),
|
||||||
|
borderSide: BorderSide(color: theme.primaryBorderColor),
|
||||||
|
),
|
||||||
|
label: Padding(
|
||||||
|
padding: const EdgeInsets.only(left: 0, bottom: 1),
|
||||||
|
child: Text(
|
||||||
|
widget.placeholder,
|
||||||
|
style: theme.textStyle.copyWith(
|
||||||
|
fontSize: FontSize.style14,
|
||||||
|
color: widget.isTouched! && widget.isError!
|
||||||
|
? theme.dangerMainColor
|
||||||
|
: theme.neutral70Color,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
floatingLabelBehavior: FloatingLabelBehavior.never,
|
||||||
|
),
|
||||||
|
child: DropdownButton<String>(
|
||||||
|
hint: Text(widget.placeholder),
|
||||||
|
value: _dropDownValue,
|
||||||
|
key: _dropDownKey,
|
||||||
|
items: widget.items,
|
||||||
|
iconSize: 0,
|
||||||
|
onChanged:(value) {
|
||||||
|
setState(() => _dropDownValue = value);
|
||||||
|
widget.onChangeComboBox?.call(value);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -139,6 +139,48 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_keyboard_visibility:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.4.0"
|
||||||
|
flutter_keyboard_visibility_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -170,6 +212,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_typeahead:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_typeahead
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -309,7 +358,7 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.0"
|
version: "1.8.0"
|
||||||
mime:
|
mime:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: mime
|
name: mime
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
|
|
|
@ -15,6 +15,8 @@ dependencies:
|
||||||
image_picker: ^0.8.6
|
image_picker: ^0.8.6
|
||||||
file_picker: ^5.2.3
|
file_picker: ^5.2.3
|
||||||
extended_image: ^6.3.4
|
extended_image: ^6.3.4
|
||||||
|
mime: ^1.0.3
|
||||||
|
flutter_typeahead: ^4.1.1
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
|
|
|
@ -160,6 +160,48 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.1.1"
|
version: "8.1.1"
|
||||||
|
flutter_keyboard_visibility:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.4.0"
|
||||||
|
flutter_keyboard_visibility_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -191,6 +233,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_typeahead:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_typeahead
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
|
@ -160,6 +160,48 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.1.1"
|
version: "8.1.1"
|
||||||
|
flutter_keyboard_visibility:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.4.0"
|
||||||
|
flutter_keyboard_visibility_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -191,6 +233,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_typeahead:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_typeahead
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
|
@ -139,6 +139,48 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_keyboard_visibility:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.4.0"
|
||||||
|
flutter_keyboard_visibility_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter_localizations:
|
flutter_localizations:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -158,6 +200,13 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.6"
|
version: "1.1.6"
|
||||||
|
flutter_typeahead:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_typeahead
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
49
pubspec.lock
49
pubspec.lock
|
@ -363,6 +363,48 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "8.1.1"
|
version: "8.1.1"
|
||||||
|
flutter_keyboard_visibility:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "5.4.0"
|
||||||
|
flutter_keyboard_visibility_linux:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_linux
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_macos:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_macos
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
|
flutter_keyboard_visibility_platform_interface:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_platform_interface
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_web:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_web
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.0"
|
||||||
|
flutter_keyboard_visibility_windows:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_keyboard_visibility_windows
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.0"
|
||||||
flutter_lints:
|
flutter_lints:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description:
|
description:
|
||||||
|
@ -394,6 +436,13 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.0"
|
version: "0.0.0"
|
||||||
|
flutter_typeahead:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: flutter_typeahead
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "4.1.1"
|
||||||
flutter_web_plugins:
|
flutter_web_plugins:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
|
|
Loading…
Reference in New Issue