Skip to content

Commit ab8423d

Browse files
committed
fix: Image cropper
1 parent ed43ed5 commit ab8423d

File tree

2 files changed

+81
-47
lines changed

2 files changed

+81
-47
lines changed

lib/features/add_wish/view/add_wish_screen.dart

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,28 @@ class AddWishScreen extends StatelessWidget {
1919
child: Column(
2020
crossAxisAlignment: CrossAxisAlignment.start,
2121
children: [
22-
const ImagePicker(),
22+
const ImagePickerWidget(),
2323
BlocBuilder<AddWishBloc, AddWishState>(
2424
builder: (context, state) {
2525
return MyTextFormField(
2626
labelText: 'Nama Tabungan',
2727
prefixIcon: Icons.notes,
2828
onChanged: (value) {
29-
context.read<AddWishBloc>().add(WishNameChanged(wishName: value ?? ''));
29+
context
30+
.read<AddWishBloc>()
31+
.add(WishNameChanged(wishName: value ?? ''));
3032
},
3133
validator: (value) {
3234
if (value!.isEmpty || value == '') {
33-
context.read<AddWishBloc>().add(const WishNameValidation(isNameValid: false));
35+
context
36+
.read<AddWishBloc>()
37+
.add(const WishNameValidation(isNameValid: false));
3438

3539
return 'Nama tabungan harus diisi';
3640
}
37-
context.read<AddWishBloc>().add(const WishNameValidation(isNameValid: true));
41+
context
42+
.read<AddWishBloc>()
43+
.add(const WishNameValidation(isNameValid: true));
3844
return null;
3945
},
4046
isValid: state.isNameValid,
@@ -49,15 +55,21 @@ class AddWishScreen extends StatelessWidget {
4955
prefixText: 'Rp.',
5056
isCurrency: true,
5157
onChanged: (value) {
52-
context.read<AddWishBloc>().add(WishSavingTargetChanged(value: value ?? '0'));
58+
context
59+
.read<AddWishBloc>()
60+
.add(WishSavingTargetChanged(value: value ?? '0'));
5361
},
5462
validator: (value) {
5563
if (value!.isEmpty || value == '') {
56-
context.read<AddWishBloc>().add(const WishTargetValidation(isSavingTargetValid: false));
64+
context.read<AddWishBloc>().add(
65+
const WishTargetValidation(
66+
isSavingTargetValid: false));
5767

5868
return 'Target tidak boleh kosong';
5969
}
60-
context.read<AddWishBloc>().add(const WishTargetValidation(isSavingTargetValid: true));
70+
context.read<AddWishBloc>().add(
71+
const WishTargetValidation(
72+
isSavingTargetValid: true));
6173
return null;
6274
},
6375
isValid: state.isSavingTargetValid,
@@ -67,7 +79,8 @@ class AddWishScreen extends StatelessWidget {
6779
const SizedBox(height: 10),
6880
Text(
6981
"Rencana Pengisian",
70-
style: theme.textTheme.titleSmall?.copyWith(color: theme.colorScheme.primary),
82+
style: theme.textTheme.titleSmall
83+
?.copyWith(color: theme.colorScheme.primary),
7184
),
7285
const SizedBox(height: 8),
7386
Row(
@@ -77,7 +90,8 @@ class AddWishScreen extends StatelessWidget {
7790
builder: (context, state) {
7891
return SegmentedButton<SavingPlan>(
7992
onSelectionChanged: (newSelection) {
80-
context.read<AddWishBloc>().add(WishSavingPlanChanged(savingPlan: newSelection.first));
93+
context.read<AddWishBloc>().add(WishSavingPlanChanged(
94+
savingPlan: newSelection.first));
8195
},
8296
showSelectedIcon: false,
8397
segments: const [
@@ -108,19 +122,30 @@ class AddWishScreen extends StatelessWidget {
108122
prefixText: 'Rp.',
109123
isCurrency: true,
110124
onChanged: (value) {
111-
context.read<AddWishBloc>().add(WishSavingNominalChanged(value: value ?? '0'));
125+
context
126+
.read<AddWishBloc>()
127+
.add(WishSavingNominalChanged(value: value ?? '0'));
112128
},
113129
validator: (value) {
114-
if (value!.isEmpty || value == '' || int.parse((value).replaceAll('.', '')) <= 0) {
115-
context.read<AddWishBloc>().add(const WishNominalValidation(isSavingNominalValid: false));
130+
if (value!.isEmpty ||
131+
value == '' ||
132+
int.parse((value).replaceAll('.', '')) <= 0) {
133+
context.read<AddWishBloc>().add(
134+
const WishNominalValidation(
135+
isSavingNominalValid: false));
116136

117137
return 'Target per ${Wish.savingPlanTimeName(state.newWish.savingPlan).toLowerCase()} tidak boleh kosong';
118-
} else if (int.parse((value).replaceAll('.', '')) >= state.newWish.savingTarget) {
119-
context.read<AddWishBloc>().add(const WishNominalValidation(isSavingNominalValid: false));
138+
} else if (int.parse((value).replaceAll('.', '')) >=
139+
state.newWish.savingTarget) {
140+
context.read<AddWishBloc>().add(
141+
const WishNominalValidation(
142+
isSavingNominalValid: false));
120143

121144
return 'Target per ${Wish.savingPlanTimeName(state.newWish.savingPlan).toLowerCase()} harus kurang dari target tabungan';
122145
}
123-
context.read<AddWishBloc>().add(const WishNominalValidation(isSavingNominalValid: true));
146+
context.read<AddWishBloc>().add(
147+
const WishNominalValidation(
148+
isSavingNominalValid: true));
124149
return null;
125150
},
126151
isValid: state.isSavingNominalValid,

lib/features/add_wish/widget/image_picker.dart

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,64 @@ import 'dart:io';
33
import 'package:celenganku_app_clone/features/add_wish/add_wish.dart';
44
import 'package:flutter/material.dart';
55
import 'package:flutter_bloc/flutter_bloc.dart';
6-
import 'package:image_cropper/image_cropper.dart' as cropper;
7-
import 'package:image_picker/image_picker.dart' as picker;
6+
import 'package:image_cropper/image_cropper.dart';
7+
import 'package:image_picker/image_picker.dart';
88

9-
class ImagePicker extends StatelessWidget {
10-
const ImagePicker({super.key});
9+
class ImagePickerWidget extends StatelessWidget {
10+
const ImagePickerWidget({super.key});
1111

12-
static picker.ImagePicker imagePicker = picker.ImagePicker();
12+
static ImagePicker imagePicker = ImagePicker();
13+
static ImageCropper imageCropper = ImageCropper();
1314

1415
/// Get from camera
1516
Future<String?> _getFromCamera() async {
16-
picker.XFile? image = await imagePicker.pickImage(
17-
source: picker.ImageSource.camera,
18-
);
17+
try {
18+
XFile? image = await imagePicker.pickImage(source: ImageSource.camera);
1919

20-
return image?.path;
20+
return image?.path;
21+
} catch (e) {
22+
debugPrint(e.toString());
23+
return null;
24+
}
2125
}
2226

2327
/// Get from gallery
2428
Future<String?> _getFromGallery() async {
25-
picker.XFile? image = await imagePicker.pickImage(
26-
source: picker.ImageSource.gallery,
27-
);
29+
try {
30+
XFile? image = await imagePicker.pickImage(source: ImageSource.gallery);
2831

29-
return image?.path;
32+
return image?.path;
33+
} catch (e) {
34+
debugPrint(e.toString());
35+
return null;
36+
}
3037
}
3138

3239
/// Crop Image
3340
Future<String?> _cropImage(BuildContext context, {required filePath}) async {
34-
if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
41+
try {
42+
CroppedFile? croppedImage = await imageCropper.cropImage(
43+
sourcePath: filePath,
44+
maxWidth: 1280,
45+
aspectRatio: const CropAspectRatio(ratioX: 16, ratioY: 9),
46+
uiSettings: [
47+
AndroidUiSettings(toolbarTitle: 'Pangkas Foto'),
48+
IOSUiSettings(title: 'Pangkas Foto'),
49+
WebUiSettings(
50+
context: context,
51+
viewPort: const CroppieViewPort(
52+
width: 1280,
53+
height: 720,
54+
),
55+
),
56+
],
57+
);
58+
59+
return croppedImage?.path;
60+
} catch (e) {
61+
debugPrint(e.toString());
3562
return filePath;
3663
}
37-
cropper.CroppedFile? croppedImage = await cropper.ImageCropper().cropImage(
38-
sourcePath: filePath,
39-
maxWidth: 1280,
40-
aspectRatio: const cropper.CropAspectRatio(ratioX: 16, ratioY: 9),
41-
uiSettings: [
42-
cropper.AndroidUiSettings(toolbarTitle: 'Pangkas Foto'),
43-
cropper.IOSUiSettings(title: 'Pangkas Foto'),
44-
cropper.WebUiSettings(context: context),
45-
],
46-
);
47-
48-
return croppedImage?.path;
4964
}
5065

5166
@override
@@ -125,12 +140,6 @@ class ImagePicker extends StatelessWidget {
125140
titleText: 'Kamera',
126141
iconData: Icons.camera_alt_outlined,
127142
onTap: () async {
128-
if (!Platform.isAndroid && !Platform.isIOS) {
129-
ScaffoldMessenger.of(context).showSnackBar(
130-
const SnackBar(content: Text('Not Supported')),
131-
);
132-
return;
133-
}
134143
String? path = await _getFromCamera().then(
135144
(path) async => await _cropImage(context, filePath: path),
136145
);

0 commit comments

Comments
 (0)