@@ -20,6 +20,13 @@ typedef FileViewerBuilder = Widget Function(
20
20
FormFieldSetter <List <PlatformFile >> filesSetter,
21
21
);
22
22
23
+ class TypeSelector {
24
+ final FileType type;
25
+ final Widget selector;
26
+
27
+ TypeSelector ({required this .type, required this .selector});
28
+ }
29
+
23
30
/// Field for image(s) from user device storage
24
31
class FormBuilderFilePicker extends FormBuilderField <List <PlatformFile >> {
25
32
/// Maximum number of files needed for this field
@@ -35,6 +42,8 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
35
42
/// Widget to be tapped on by user in order to pick files
36
43
final Widget selector;
37
44
45
+ final List <TypeSelector >? typeSelectors;
46
+
38
47
/// Default types of files to be picked. Default set to [FileType.any]
39
48
final FileType type;
40
49
@@ -84,6 +93,7 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
84
93
this .previewImages = true ,
85
94
this .selector = const Icon (Icons .add_circle),
86
95
this .type = FileType .any,
96
+ this .typeSelectors,
87
97
this .allowedExtensions,
88
98
this .onFileLoading,
89
99
this .allowCompression = true ,
@@ -104,6 +114,9 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
104
114
builder: (FormFieldState <List <PlatformFile >?> field) {
105
115
final state = field as _FormBuilderFilePickerState ;
106
116
117
+ List <TypeSelector > _typeSelectors =
118
+ typeSelectors ?? [TypeSelector (type: type, selector: selector)];
119
+
107
120
return InputDecorator (
108
121
decoration: state.decoration,
109
122
child: Column (
@@ -113,13 +126,15 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
113
126
children: < Widget > [
114
127
if (maxFiles != null )
115
128
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
+ ),
123
138
),
124
139
],
125
140
),
@@ -172,13 +187,14 @@ class _FormBuilderFilePickerState
172
187
_files = widget.initialValue ?? [];
173
188
}
174
189
175
- Future <void > pickFiles (FormFieldState <List <PlatformFile >?> field) async {
190
+ Future <void > pickFiles (
191
+ FormFieldState <List <PlatformFile >?> field, FileType fileType) async {
176
192
FilePickerResult ? resultList;
177
193
178
194
try {
179
195
if (kIsWeb || await Permission .storage.request ().isGranted) {
180
196
resultList = await FilePicker .platform.pickFiles (
181
- type: widget.type ,
197
+ type: fileType ,
182
198
allowedExtensions: widget.allowedExtensions,
183
199
allowCompression: widget.allowCompression,
184
200
onFileLoading: widget.onFileLoading,
0 commit comments