Skip to content

Commit 32af867

Browse files
Merge pull request #31 from grundid/type_selectors
add support for multiple type selectors to open different file/image pickers
2 parents ffdbd5f + f118abd commit 32af867

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

lib/src/form_builder_file_picker.dart

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ typedef FileViewerBuilder = Widget Function(
2020
FormFieldSetter<List<PlatformFile>> filesSetter,
2121
);
2222

23+
class TypeSelector {
24+
final FileType type;
25+
final Widget selector;
26+
27+
TypeSelector({required this.type, required this.selector});
28+
}
29+
2330
/// Field for image(s) from user device storage
2431
class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
2532
/// Maximum number of files needed for this field
@@ -35,6 +42,8 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
3542
/// Widget to be tapped on by user in order to pick files
3643
final Widget selector;
3744

45+
final List<TypeSelector>? typeSelectors;
46+
3847
/// Default types of files to be picked. Default set to [FileType.any]
3948
final FileType type;
4049

@@ -84,6 +93,7 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
8493
this.previewImages = true,
8594
this.selector = const Icon(Icons.add_circle),
8695
this.type = FileType.any,
96+
this.typeSelectors,
8797
this.allowedExtensions,
8898
this.onFileLoading,
8999
this.allowCompression = true,
@@ -104,6 +114,9 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
104114
builder: (FormFieldState<List<PlatformFile>?> field) {
105115
final state = field as _FormBuilderFilePickerState;
106116

117+
List<TypeSelector> typeSelectorList =
118+
typeSelectors ?? [TypeSelector(type: type, selector: selector)];
119+
107120
return InputDecorator(
108121
decoration: state.decoration.copyWith(
109122
counterText: maxFiles != null
@@ -114,13 +127,15 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
114127
Row(
115128
mainAxisAlignment: MainAxisAlignment.spaceBetween,
116129
children: <Widget>[
117-
InkWell(
118-
onTap: state.enabled &&
119-
(null == state._remainingItemCount ||
120-
state._remainingItemCount! > 0)
121-
? () => state.pickFiles(field)
122-
: null,
123-
child: selector,
130+
...typeSelectorList.map(
131+
(typeSelector) => InkWell(
132+
onTap: state.enabled &&
133+
(null == state._remainingItemCount ||
134+
state._remainingItemCount! > 0)
135+
? () => state.pickFiles(field, typeSelector.type)
136+
: null,
137+
child: typeSelector.selector,
138+
),
124139
),
125140
],
126141
),
@@ -173,13 +188,14 @@ class _FormBuilderFilePickerState
173188
_files = widget.initialValue ?? [];
174189
}
175190

176-
Future<void> pickFiles(FormFieldState<List<PlatformFile>?> field) async {
191+
Future<void> pickFiles(
192+
FormFieldState<List<PlatformFile>?> field, FileType fileType) async {
177193
FilePickerResult? resultList;
178194

179195
try {
180196
if (kIsWeb || await Permission.storage.request().isGranted) {
181197
resultList = await FilePicker.platform.pickFiles(
182-
type: widget.type,
198+
type: fileType,
183199
allowedExtensions: widget.allowedExtensions,
184200
allowCompression: widget.allowCompression,
185201
onFileLoading: widget.onFileLoading,

0 commit comments

Comments
 (0)