Skip to content

Commit 69363c7

Browse files
committed
add support for multiple type selectors to open different file/images pickers
1 parent 36fefe2 commit 69363c7

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> _typeSelectors =
118+
typeSelectors ?? [TypeSelector(type: type, selector: selector)];
119+
107120
return InputDecorator(
108121
decoration: state.decoration,
109122
child: Column(
@@ -113,13 +126,15 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
113126
children: <Widget>[
114127
if (maxFiles != null)
115128
Text('${state._files.length} / $maxFiles'),
116-
InkWell(
117-
onTap: state.enabled &&
118-
(null == state._remainingItemCount ||
119-
state._remainingItemCount! > 0)
120-
? () => state.pickFiles(field)
121-
: null,
122-
child: selector,
129+
..._typeSelectors.map(
130+
(typeSelector) => InkWell(
131+
onTap: state.enabled &&
132+
(null == state._remainingItemCount ||
133+
state._remainingItemCount! > 0)
134+
? () => state.pickFiles(field, typeSelector.type)
135+
: null,
136+
child: typeSelector.selector,
137+
),
123138
),
124139
],
125140
),
@@ -172,13 +187,14 @@ class _FormBuilderFilePickerState
172187
_files = widget.initialValue ?? [];
173188
}
174189

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

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

0 commit comments

Comments
 (0)