├── .flutter-plugins
├── .flutter-plugins-dependencies
├── .gitignore
├── .metadata
├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── lib
├── bc_image_editor.dart
└── edit_with_gesture.dart
├── media
└── examples
│ ├── 2d.gif
│ ├── horizontal.gif
│ ├── size.gif
│ ├── vertical.gif
│ └── viewMode.gif
├── pubspec.yaml
└── test
└── bc_image_editor_test.dart
/.flutter-plugins:
--------------------------------------------------------------------------------
1 | # This is a generated file; do not edit or check into version control.
2 | path_provider=/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-2.0.9/
3 | path_provider_android=/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.12/
4 | path_provider_ios=/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.8/
5 | path_provider_linux=/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.5/
6 | path_provider_macos=/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.5/
7 | path_provider_windows=/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.5/
8 |
--------------------------------------------------------------------------------
/.flutter-plugins-dependencies:
--------------------------------------------------------------------------------
1 | {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"path_provider_ios","path":"/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_ios-2.0.8/","dependencies":[]}],"android":[{"name":"path_provider_android","path":"/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_android-2.0.12/","dependencies":[]}],"macos":[{"name":"path_provider_macos","path":"/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-2.0.5/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-2.1.5/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/berkayceylan/Programming/flutter-sdk/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-2.0.5/","dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_android","path_provider_ios","path_provider_linux","path_provider_macos","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_ios","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]}],"date_created":"2022-04-06 17:04:25.914394","version":"2.8.0"}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
25 | /pubspec.lock
26 | **/doc/api/
27 | .dart_tool/
28 | .packages
29 | build/
30 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: cf4400006550b70f28e4b4af815151d1e74846c6
8 | channel: stable
9 |
10 | project_type: package
11 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## 0.0.1
2 |
3 | * Initial version.
4 |
5 | ## 0.0.2
6 |
7 | * Added gesture detector editing.
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Berkay CEYLAN
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # BC Image Editor
2 | You can edit image using this package and also you can create flex preview image by setting foreground to null. For now, you can use only asset files.
3 |
4 | https://pub.dev/packages/bc_image_editor
5 | [](https://github.com/berkayceylan/bc_image_editor)
6 |
7 |
8 | ## Features
9 |
10 | - Background and Foreground(optional) image
11 | - Resize images
12 | - Set x,y position them
13 | - 3D rotate image image on x, y axis (Foreground only)
14 | - 2D rotate foreground image
15 | - Scale for detail view
16 | - Use on device files or asset files
17 | - Edit foreground image with gesture detector moves.
18 | - Size and position.
19 | - 3D rotate Horizontal and Vertical
20 | - 2D rotate
21 | - View mode (Scale)
22 |
23 |
24 |
25 | ## Getting started
26 | Import:
27 | ```dart
28 | import 'package:bc_image_editor/bc_image_editor.dart';
29 | ```
30 | Using:
31 | ```dart
32 | BcImageEditor(
33 | frontImage: "image/path",
34 | bgImage: "image/path",
35 | frontWidth: 200,
36 | frontHeight: 300,
37 | bgWidth: 300,
38 | bgHeight: 200, //If one of variable of width and height not setted or set to null, the other one will auto scale
39 | frontLeft: 10,
40 | frontTop: 10,
41 | bgLeft: 10,
42 | bgTop: 10,
43 | frontBoxFit: BoxFit.fill,
44 | bgBoxFit: BoxFit.fill,
45 | rotateX: 0, //rotateX and y are on 3D axis
46 | rotateY: 0,
47 | rotate2D: 0,
48 | ),
49 | ```
50 | ---
51 |
52 |
53 | ## Edit image with gesture detector
54 | Import:
55 | ```dart
56 | import 'package:bc_image_editor/edit_with_gesture.dart';
57 | ```
58 | Using:
59 | ```dart
60 | EditWithGesture(
61 | frontImage: frontFilePath,
62 | bgImage: bgFilePath,
63 | editMode: EditMode.verticalRotate,
64 | );
65 | ```
66 |
67 | Gesture Editing Modes:
68 | | Editing Mode | Function |
69 | |------------------|-----------------------------------------------------------|
70 | | size | Resize and change position image. |
71 | | horizontalRotate | Rotate image horizontal on 3D axis. |
72 | | verticalRotate | Rotate image vertical on 3D axis. |
73 | | rotate2D | 2D rotation. |
74 | | viewMode | Zoom image for detail things (it doesn't do any editing). |
75 | | noEdit | Close the editing. |
76 |
77 |
78 | ---
79 | ## Using from asset folder image
80 |
81 |
82 | First initialize your path name:
83 | ```dart
84 | String imagePath = "";
85 | ```
86 | Then create a async function like below and use it in initState:
87 | ```dart
88 | void initFiles() async {
89 | File tempImg =
90 | await getImageFileFromAssets("assets/image/path");
91 | setState(() {
92 | imagePath = tempImg.path;
93 | });
94 | }
95 | ```
96 | ## Example
97 | For example; you wanna edit image with gesture detector and use image from asset file.
98 |
99 | Import edit_with_gesture file
100 | ```dart
101 |
102 | import 'package:bc_image_editor/bc_image_editor.dart';
103 | import 'package:bc_image_editor/edit_with_gesture.dart';
104 |
105 | ```
106 |
107 | Create file paths as variables:
108 |
109 | ```dart
110 | String frontFilePath = "", bgFilePath = "";
111 | ```
112 | Create a async variable to get image files. And get images from asset with "getImageFileFromAssets" function. (If you want use device image you can write path directly).
113 |
114 | ```dart
115 | void initFiles() async {
116 | File frontTempFile =
117 | await getImageFileFromAssets("assets/images/example-front.png");
118 | File tempFileBg = await getImageFileFromAssets("assets/images/example-bg.jpg");
119 | setState(() {
120 | frontFilePath = frontTempFile.path;
121 | bgFilePath = tempFileBg.path;
122 | });
123 | }
124 | ```
125 |
126 | Use this function on initState:
127 |
128 | ```dart
129 | @override
130 | void initState() {
131 | // TODO: implement initState
132 | super.initState();
133 | initFiles();
134 | }
135 | ```
136 |
137 | Use EditWithGesture widget:
138 | ```dart
139 | EditWithGesture(
140 | frontImage: frontFilePath,
141 | bgImage: bgFilePath,
142 | editMode: EditMode.verticalRotate,
143 | );
144 | ```
145 |
146 | Edit With Gesture Detector Examples:
147 |
148 | ```dart
149 | EditMode.size
150 | ```
151 |
152 |
153 |
154 | ```dart
155 | EditMode.horizontalRotate
156 | ```
157 |
158 |
159 | ```dart
160 | EditMode.verticalRotate
161 | ```
162 |
163 |
164 |
165 | ```dart
166 | EditMode.rotate2D
167 |
168 | ```
169 |
170 |
171 | ```dart
172 | EditMode.viewMode
173 | ```
174 |
175 |
176 |
177 | Full Code:
178 | ```dart
179 | import 'dart:io';
180 |
181 | import 'package:flutter/material.dart';
182 | import 'package:bc_image_editor/bc_image_editor.dart';
183 | import 'package:bc_image_editor/edit_with_gesture.dart';
184 |
185 | void main() {
186 | runApp(const MyApp());
187 | }
188 |
189 | class MyApp extends StatelessWidget {
190 | const MyApp({Key? key}) : super(key: key);
191 |
192 | @override
193 | Widget build(BuildContext context) {
194 | return MaterialApp(
195 | title: 'Flutter Demo',
196 | home: Scaffold(
197 | appBar: AppBar(
198 | title: const Text("Test"),
199 | ),
200 | body: const Home(),
201 | ),
202 | );
203 | }
204 | }
205 |
206 | class Home extends StatefulWidget {
207 | const Home({Key? key}) : super(key: key);
208 |
209 | @override
210 | _HomeState createState() => _HomeState();
211 | }
212 |
213 | class _HomeState extends State {
214 | String frontFilePath = "", bgFilePath = "";
215 |
216 | void initFiles() async {
217 | File frontTempFile =
218 | await getImageFileFromAssets("assets/images/char-2.png");
219 | File tempFileBg = await getImageFileFromAssets("assets/images/bg-2.jpg");
220 | setState(() {
221 | frontFilePath = frontTempFile.path;
222 | bgFilePath = tempFileBg.path;
223 | });
224 | }
225 |
226 | @override
227 | void initState() {
228 | super.initState();
229 | initFiles();
230 | }
231 |
232 | @override
233 | Widget build(BuildContext context) {
234 | return EditWithGesture(
235 | frontImage: frontFilePath,
236 | bgImage: bgFilePath,
237 | editMode: EditMode.verticalRotate,
238 | );
239 | }
240 | }
241 |
242 | ```
243 |
244 | # LICENSE
245 | MIT License
246 |
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | include: package:flutter_lints/flutter.yaml
2 |
3 | # Additional information about this file can be found at
4 | # https://dart.dev/guides/language/analysis-options
5 |
--------------------------------------------------------------------------------
/lib/bc_image_editor.dart:
--------------------------------------------------------------------------------
1 | library bc_image_editor;
2 |
3 | import 'dart:io';
4 | import 'dart:math';
5 |
6 | import 'package:flutter/material.dart';
7 | import 'package:flutter/services.dart';
8 | import 'package:path_provider/path_provider.dart';
9 | Future getImageFileFromAssets(String path) async {
10 | final byteData = await rootBundle.load(path);
11 |
12 | final file = File('${(await getTemporaryDirectory()).path}/$path');
13 | bool exist = await file.exists();
14 | if (!exist) {
15 | await file.create(recursive: true);
16 | }
17 |
18 | await file.writeAsBytes(byteData.buffer
19 | .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
20 |
21 | return file;
22 | }
23 |
24 | class BcImageEditor extends StatelessWidget {
25 |
26 | final String? bgImage, frontImage;
27 |
28 | final double? frontLeft,
29 | frontTop,
30 | frontWidth,
31 | rotateX,
32 | rotateY,
33 | rotate2D,
34 | frontHeight;
35 | final double? transformScale, bgLeft, bgTop, bgWidth, bgHeight;
36 |
37 | final BoxFit frontBoxFit, bgBoxFit;
38 |
39 |
40 | const BcImageEditor({
41 | Key? key,
42 | @required this.frontImage,
43 | @required this.bgImage,
44 | this.frontWidth,
45 | this.frontHeight,
46 | this.frontLeft,
47 | this.frontTop,
48 | this.frontBoxFit = BoxFit.fill,
49 | this.bgWidth,
50 | this.bgHeight,
51 | this.bgLeft,
52 | this.bgTop,
53 | this.bgBoxFit = BoxFit.fill,
54 | this.rotateX = 0,
55 | this.rotateY = 0,
56 | this.rotate2D = 0,
57 | this.transformScale = 1,
58 | }) : super(key: key);
59 |
60 | @override
61 | Widget build(BuildContext context) {
62 | return SizedBox(
63 | width: MediaQuery.of(context).size.width,
64 | height: MediaQuery.of(context).size.height,
65 | child: Transform.scale(
66 | alignment: Alignment.bottomCenter,
67 | scale: transformScale!,
68 | child: Stack(
69 | alignment: Alignment.center,
70 | children: [
71 | Positioned(
72 | left: bgLeft,
73 | top: bgTop,
74 | child: bgImage == ""
75 | ? const SizedBox.shrink()
76 | : Image.file(
77 | File(bgImage!),
78 | fit: bgBoxFit,
79 | width: bgWidth,
80 | height: bgHeight,
81 | ),
82 | ),
83 | Positioned(
84 | left: frontLeft,
85 | top: frontTop,
86 | child: Transform.rotate(
87 | angle: rotate2D!,
88 | child: Transform(
89 | transform: Matrix4.identity()
90 | ..setEntry(3, 2, 0.001)
91 | ..rotateY(pi / 180 * rotateY!)
92 | ..rotateX(pi / 180 * rotateX!),
93 | alignment: Alignment.center,
94 | child: Stack(
95 | children: [
96 | frontImage! == ""
97 | ? const SizedBox.shrink()
98 | : Image.file(
99 | File(frontImage!),
100 | fit: frontBoxFit,
101 | width: frontWidth,
102 | height: frontHeight,
103 | ),
104 | ],
105 | ),
106 | ),
107 | ),
108 | ),
109 | ],
110 | ),
111 | ),
112 | );
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/lib/edit_with_gesture.dart:
--------------------------------------------------------------------------------
1 | library bc_image_editor;
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:bc_image_editor/bc_image_editor.dart';
5 | import 'package:gesture_x_detector/gesture_x_detector.dart';
6 |
7 | enum EditMode {
8 | size,
9 | horizontalRotate,
10 | verticalRotate,
11 | rotate2D,
12 | viewMode,
13 | noEdit
14 | }
15 |
16 | class EditWithGesture extends StatefulWidget {
17 | final String frontImage, bgImage;
18 | final EditMode editMode;
19 | const EditWithGesture({
20 | Key? key,
21 | this.frontImage = "",
22 | this.bgImage = "",
23 | this.editMode = EditMode.noEdit,
24 | }) : super(key: key);
25 |
26 | @override
27 | State createState() => _EditWithGestureState();
28 | }
29 |
30 | class _EditWithGestureState extends State {
31 | double frontTop = 300,
32 | frontLeft = 100,
33 | firstHeight = 100,
34 | rotateY = 0,
35 | rotateX = 0,
36 | scaleAmount = 1,
37 | frontWidth = 100;
38 |
39 | double bgLeft = 50,
40 | bgTop = 300,
41 | bgWidth = 300,
42 | scaleAmountBg = 1,
43 | firstWidthBg = 300,
44 | firstTransformScale = 1,
45 | transformScale = 1,
46 | rotate2D = 0;
47 |
48 | void mouseMove(MoveEvent event) {
49 | setState(() {
50 | switch (widget.editMode) {
51 | case EditMode.horizontalRotate:
52 | rotateY += event.delta.dx;
53 | break;
54 | case EditMode.verticalRotate:
55 | rotateX += event.delta.dy;
56 | break;
57 | case EditMode.viewMode:
58 | bgTop = bgTop + event.delta.dy;
59 | bgLeft = bgLeft + event.delta.dx;
60 | frontTop += event.delta.dy;
61 | frontLeft += event.delta.dx;
62 | break;
63 | case EditMode.rotate2D:
64 | rotate2D += event.delta.dx / 100;
65 | break;
66 | case EditMode.noEdit:
67 | break;
68 | default:
69 | frontTop += event.delta.dy / firstTransformScale;
70 | frontLeft += event.delta.dx / firstTransformScale;
71 | break;
72 | }
73 | });
74 | }
75 |
76 | void mouseScale(ScaleEvent event) {
77 | setState(() {
78 | switch (widget.editMode) {
79 | case EditMode.viewMode:
80 | transformScale = firstTransformScale * event.scale;
81 | debugPrint(event.scale.toString());
82 | break;
83 | case EditMode.noEdit:
84 | break;
85 | default:
86 | frontWidth = firstHeight * event.scale;
87 | scaleAmount = event.scale;
88 | break;
89 | }
90 | });
91 | }
92 |
93 | @override
94 | Widget build(BuildContext context) {
95 | return XGestureDetector(
96 | onScaleEnd: () {
97 | switch (widget.editMode) {
98 | case EditMode.viewMode:
99 | firstTransformScale = transformScale;
100 | break;
101 | case EditMode.noEdit:
102 | break;
103 | default:
104 | firstHeight *= scaleAmount;
105 | break;
106 | }
107 | },
108 | onScaleUpdate: mouseScale,
109 | onMoveUpdate: mouseMove,
110 | child: BcImageEditor(
111 | frontImage: widget.frontImage,
112 | bgImage: widget.bgImage,
113 | frontWidth: frontWidth,
114 | bgWidth: bgWidth,
115 | frontTop: frontTop,
116 | frontLeft: frontLeft,
117 | bgTop: bgTop,
118 | bgLeft: bgLeft,
119 | transformScale: transformScale,
120 | rotateX: rotateX,
121 | rotateY: rotateY,
122 | rotate2D: rotate2D,
123 | bgBoxFit: BoxFit.cover,
124 | frontBoxFit: BoxFit.cover,
125 | ),
126 | );
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/media/examples/2d.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berkayceylan/bc_image_editor/a16a1fa06395fe46445c93b82e4a3d2a34577539/media/examples/2d.gif
--------------------------------------------------------------------------------
/media/examples/horizontal.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berkayceylan/bc_image_editor/a16a1fa06395fe46445c93b82e4a3d2a34577539/media/examples/horizontal.gif
--------------------------------------------------------------------------------
/media/examples/size.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berkayceylan/bc_image_editor/a16a1fa06395fe46445c93b82e4a3d2a34577539/media/examples/size.gif
--------------------------------------------------------------------------------
/media/examples/vertical.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berkayceylan/bc_image_editor/a16a1fa06395fe46445c93b82e4a3d2a34577539/media/examples/vertical.gif
--------------------------------------------------------------------------------
/media/examples/viewMode.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/berkayceylan/bc_image_editor/a16a1fa06395fe46445c93b82e4a3d2a34577539/media/examples/viewMode.gif
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: bc_image_editor
2 | description: Do you need quick image editing? You can do it with this package. It is very useful and quick tool.
3 | version: 0.0.2
4 | repository: "https://github.com/berkayceylan150/bc-image-editor"
5 |
6 | environment:
7 | sdk: ">=2.15.0 <3.0.0"
8 | flutter: ">=1.17.0"
9 |
10 | dependencies:
11 | flutter:
12 | sdk: flutter
13 | gesture_x_detector: ^1.0.0
14 | path_provider: ^2.0.9
15 |
16 | dev_dependencies:
17 | flutter_test:
18 | sdk: flutter
19 | flutter_lints: ^1.0.0
20 |
21 | # For information on the generic Dart part of this file, see the
22 | # following page: https://dart.dev/tools/pub/pubspec
23 |
24 | # The following section is specific to Flutter.
25 | flutter:
26 |
27 | # To add assets to your package, add an assets section, like this:
28 | # assets:
29 | # - images/a_dot_burr.jpeg
30 | # - images/a_dot_ham.jpeg
31 | #
32 | # For details regarding assets in packages, see
33 | # https://flutter.dev/assets-and-images/#from-packages
34 | #
35 | # An image asset can refer to one or more resolution-specific "variants", see
36 | # https://flutter.dev/assets-and-images/#resolution-aware.
37 |
38 | # To add custom fonts to your package, add a fonts section here,
39 | # in this "flutter" section. Each entry in this list should have a
40 | # "family" key with the font family name, and a "fonts" key with a
41 | # list giving the asset and other descriptors for the font. For
42 | # example:
43 | # fonts:
44 | # - family: Schyler
45 | # fonts:
46 | # - asset: fonts/Schyler-Regular.ttf
47 | # - asset: fonts/Schyler-Italic.ttf
48 | # style: italic
49 | # - family: Trajan Pro
50 | # fonts:
51 | # - asset: fonts/TrajanPro.ttf
52 | # - asset: fonts/TrajanPro_Bold.ttf
53 | # weight: 700
54 | #
55 | # For details regarding fonts in packages, see
56 | # https://flutter.dev/custom-fonts/#from-packages
57 |
--------------------------------------------------------------------------------
/test/bc_image_editor_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_test/flutter_test.dart';
2 |
3 | import 'package:bc_image_editor/bc_image_editor.dart';
4 |
5 | void main() {
6 |
7 | }
8 |
--------------------------------------------------------------------------------