@@ -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 > typeSelectorList =
118
+ typeSelectors ?? [TypeSelector (type: type, selector: selector)];
119
+
107
120
return InputDecorator (
108
121
decoration: state.decoration.copyWith (
109
122
counterText: maxFiles != null
@@ -114,13 +127,15 @@ class FormBuilderFilePicker extends FormBuilderField<List<PlatformFile>> {
114
127
Row (
115
128
mainAxisAlignment: MainAxisAlignment .spaceBetween,
116
129
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
+ ),
124
139
),
125
140
],
126
141
),
@@ -173,13 +188,14 @@ class _FormBuilderFilePickerState
173
188
_files = widget.initialValue ?? [];
174
189
}
175
190
176
- Future <void > pickFiles (FormFieldState <List <PlatformFile >?> field) async {
191
+ Future <void > pickFiles (
192
+ FormFieldState <List <PlatformFile >?> field, FileType fileType) async {
177
193
FilePickerResult ? resultList;
178
194
179
195
try {
180
196
if (kIsWeb || await Permission .storage.request ().isGranted) {
181
197
resultList = await FilePicker .platform.pickFiles (
182
- type: widget.type ,
198
+ type: fileType ,
183
199
allowedExtensions: widget.allowedExtensions,
184
200
allowCompression: widget.allowCompression,
185
201
onFileLoading: widget.onFileLoading,
0 commit comments