Skip to content

Commit 250214c

Browse files
Merge pull request #54 from mvarendorff/feat/preview-builder
feat: support fully custom preview
2 parents facbe5d + 33fb0d1 commit 250214c

File tree

5 files changed

+47
-4
lines changed

5 files changed

+47
-4
lines changed

example/lib/main.dart

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import 'package:flutter/cupertino.dart';
22
import 'package:flutter/material.dart';
33
import 'package:flutter_form_builder/flutter_form_builder.dart';
4-
54
import 'package:form_builder_image_picker/form_builder_image_picker.dart';
65

76
void main() {
@@ -52,6 +51,7 @@ class MyHomePage extends StatelessWidget {
5251
key: _formKey,
5352
child: SingleChildScrollView(
5453
child: Column(
54+
mainAxisSize: MainAxisSize.min,
5555
mainAxisAlignment: MainAxisAlignment.center,
5656
children: <Widget>[
5757
FormBuilderImagePicker(
@@ -157,7 +157,7 @@ class MyHomePage extends StatelessWidget {
157157
FormBuilderImagePicker(
158158
decoration: const InputDecoration(
159159
labelText: 'Pick Photos (with custom view)'),
160-
name: "CupertinoActionSheet",
160+
name: 'CupertinoActionSheet',
161161
optionsBuilder: (cameraPicker, galleryPicker) =>
162162
CupertinoActionSheet(
163163
title: const Text('Image'),
@@ -184,6 +184,23 @@ class MyHomePage extends StatelessWidget {
184184
builder: (context) => child,
185185
),
186186
),
187+
FormBuilderImagePicker(
188+
name: 'customPreview',
189+
maxImages: null,
190+
previewBuilder: (context, images, addButton) =>
191+
ConstrainedBox(
192+
constraints: const BoxConstraints(
193+
minHeight: 130,
194+
maxHeight: 500,
195+
),
196+
child: GridView.extent(
197+
maxCrossAxisExtent: 130,
198+
mainAxisSpacing: 4,
199+
crossAxisSpacing: 4,
200+
children: [...images, if (addButton != null) addButton],
201+
),
202+
),
203+
),
187204
ElevatedButton(
188205
child: const Text('Submit'),
189206
onPressed: () {

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ packages:
113113
path: ".."
114114
relative: true
115115
source: path
116-
version: "5.0.0"
116+
version: "4.0.0"
117117
http:
118118
dependency: transitive
119119
description:

lib/src/form_builder_image_picker.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
import 'dart:typed_data';
22

33
import 'package:async/async.dart';
4+
import 'package:collection/collection.dart';
45
import 'package:flutter/material.dart';
56
import 'package:flutter_form_builder/flutter_form_builder.dart';
67
import 'package:image_picker/image_picker.dart';
78

89
import 'image_source_option.dart';
910
import 'image_source_sheet.dart';
1011

12+
typedef PreviewBuilder = Widget Function(
13+
BuildContext,
14+
List<Widget> children,
15+
Widget? addButton,
16+
);
17+
1118
/// Field for picking image(s) from Gallery or Camera.
1219
///
1320
/// Field value is a list of objects.
@@ -37,6 +44,9 @@ class FormBuilderImagePicker extends FormBuilderFieldDecoration<List<dynamic>> {
3744
/// margins between image previews
3845
final EdgeInsetsGeometry? previewMargin;
3946

47+
/// May be supplied for a fully custom display of the image preview
48+
final PreviewBuilder? previewBuilder;
49+
4050
/// placeholder image displayed when picking a new image
4151
final ImageProvider? placeholderImage;
4252

@@ -132,6 +142,7 @@ class FormBuilderImagePicker extends FormBuilderFieldDecoration<List<dynamic>> {
132142
this.showDecoration = true,
133143
this.placeholderWidget,
134144
this.previewAutoSizeWidth = true,
145+
this.previewBuilder,
135146
this.fit = BoxFit.cover,
136147
this.preventPop = false,
137148
this.displayCustomType,
@@ -307,6 +318,20 @@ class FormBuilderImagePicker extends FormBuilderFieldDecoration<List<dynamic>> {
307318
);
308319
}
309320

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+
310335
final child = SizedBox(
311336
height: previewHeight,
312337
child: itemCount == 0

pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ packages:
2626
source: hosted
2727
version: "1.1.1"
2828
collection:
29-
dependency: transitive
29+
dependency: "direct main"
3030
description:
3131
name: collection
3232
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687

pubspec.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ dependencies:
1616
sdk: flutter
1717
flutter_form_builder: ^9.1.1
1818
async: ^2.11.0
19+
collection: ^1.17.0
1920
image_picker: ^1.0.4
2021

2122
dev_dependencies:

0 commit comments

Comments
 (0)