|
1 | 1 | import 'dart:typed_data';
|
2 | 2 |
|
3 | 3 | import 'package:async/async.dart';
|
| 4 | +import 'package:collection/collection.dart'; |
4 | 5 | import 'package:flutter/material.dart';
|
5 | 6 | import 'package:flutter_form_builder/flutter_form_builder.dart';
|
6 | 7 | import 'package:image_picker/image_picker.dart';
|
7 | 8 |
|
8 | 9 | import 'image_source_option.dart';
|
9 | 10 | import 'image_source_sheet.dart';
|
10 | 11 |
|
| 12 | +typedef PreviewBuilder = Widget Function( |
| 13 | + BuildContext, |
| 14 | + List<Widget> children, |
| 15 | + Widget? addButton, |
| 16 | +); |
| 17 | + |
11 | 18 | /// Field for picking image(s) from Gallery or Camera.
|
12 | 19 | ///
|
13 | 20 | /// Field value is a list of objects.
|
@@ -37,6 +44,9 @@ class FormBuilderImagePicker extends FormBuilderFieldDecoration<List<dynamic>> {
|
37 | 44 | /// margins between image previews
|
38 | 45 | final EdgeInsetsGeometry? previewMargin;
|
39 | 46 |
|
| 47 | + /// May be supplied for a fully custom display of the image preview |
| 48 | + final PreviewBuilder? previewBuilder; |
| 49 | + |
40 | 50 | /// placeholder image displayed when picking a new image
|
41 | 51 | final ImageProvider? placeholderImage;
|
42 | 52 |
|
@@ -132,6 +142,7 @@ class FormBuilderImagePicker extends FormBuilderFieldDecoration<List<dynamic>> {
|
132 | 142 | this.showDecoration = true,
|
133 | 143 | this.placeholderWidget,
|
134 | 144 | this.previewAutoSizeWidth = true,
|
| 145 | + this.previewBuilder, |
135 | 146 | this.fit = BoxFit.cover,
|
136 | 147 | this.preventPop = false,
|
137 | 148 | this.displayCustomType,
|
@@ -307,6 +318,20 @@ class FormBuilderImagePicker extends FormBuilderFieldDecoration<List<dynamic>> {
|
307 | 318 | );
|
308 | 319 | }
|
309 | 320 |
|
| 321 | + if (previewBuilder != null) { |
| 322 | + return Builder(builder: (context) { |
| 323 | + final widgets = value |
| 324 | + .mapIndexed((i, v) => itemBuilder(context, v, i)) |
| 325 | + .toList(); |
| 326 | + |
| 327 | + return previewBuilder( |
| 328 | + context, |
| 329 | + widgets, |
| 330 | + canUpload ? addButtonBuilder(context) : null, |
| 331 | + ); |
| 332 | + }); |
| 333 | + } |
| 334 | + |
310 | 335 | final child = SizedBox(
|
311 | 336 | height: previewHeight,
|
312 | 337 | child: itemCount == 0
|
|
0 commit comments