#flutter #flutter-getx #imagepicker
Вопрос:
Я пытался реализовать image_picker с помощью Getx, но не преуспел.
Версия Getx-4.3.8 Версия средства выбора изображений-0.8.4 4
Вот мой [pubspec.yaml][1]
Вот мой [home_view.dart][2]
Вот мой [home_controller.dart][3]
проблема: Когда я выбираю изображение, приложение выходит из строя.
[1]: https://pastebin.com/ZvVHVNaY [2]: https://pastebin.com/TFVu42mK [3]: https://pastebin.com/kcQXsjEe
Для получения полного кода, пожалуйста, посетите страницу pastebin.
Вот некоторая часть кода. home_view.dart
body: Column( children: [ Expanded( child: !kIsWeb amp;amp; defaultTargetPlatform == TargetPlatform.android ? FutureBuilderlt;voidgt;( future: c.retrieveLostData(), builder: (BuildContext context, AsyncSnapshotlt;voidgt; snapshot) { switch (snapshot.connectionState) { case ConnectionState.none: case ConnectionState.waiting: return Text("No Data"); case ConnectionState.done: return c.returnData(); default: if (snapshot.hasError) { return Text( 'Pick image/video error: ${snapshot.error}}', textAlign: TextAlign.center, ); } else { return const Text( 'You have not yet picked an image.', textAlign: TextAlign.center, ); } } }) : c.returnData()), TextButton( onPressed: () async { await c.fetchImage(); }, child: Text("Fetch Image"))
home_controller.dart
class HomeController extends GetxController { ImagePicker picker = ImagePicker(); final selectedPath = "".obs; final file = Rxlt;XFile?gt;(null); final retrieveDataError = "".obs; final pickImageError = "".obs; Futurelt;voidgt; retrieveLostData() async { final LostDataResponse response = await picker.retrieveLostData(); if (response.isEmpty) { return; } if (response.file != null) { file.value = response.file; print("second retrived"); } else { retrieveDataError.value = response.exception!.code; } } returnData() { if (pickImageError.value == "" amp;amp; retrieveDataError.value == "") { return Text("No Data"); } else if (file.value != null) { return Image.file(File(file.value!.path)); } else { retrieveDataError(); return CircularProgressIndicator(); } } fetchImage() async { try { final pickedFile = await picker.pickImage(source: ImageSource.camera); if (pickedFile != null) { file.value = pickedFile; print("first picked"); } else { retrieveLostData(); print("first retrived"); } } catch (e) { pickImageError.value = e.toString(); } } }
Я попытался реализовать пример, приведенный в пакете, но с использованием getx.
Без Getx он работает нормально.
Пожалуйста, помогите мне найти то, чего мне не хватает?
Комментарии:
1. поделитесь своим кодом, чтобы получить лучший ответ
2. Поделился в пастебине, поделился и здесь.
Ответ №1:
home_controller.дротик
ImagePicker imagePicker = ImagePicker(); File? image; Futurelt;voidgt; uploadIDPhoto() async { final XFile? _image = (await imagePicker.pickImage( source: ImageSource.gallery, imageQuality: 50)); if (image != null) { image = File(_image!.path); update(); } else { Get.snackbar('Error', 'Please Provide Image'); } }
Это простое рабочее решение.. в home_view.dart просто есть
GestureDetector( onTap: () async { await controller.uploadIDPhoto(); }, child: AbsorbPointer( child: Input( child: TextFormField( decoration: InputStyle(label: 'Browse').input( color: AppColor.pink, ), ), ), ), ),
Комментарии:
1. Это кажется нормальным, но как я могу реализовать « Futurelt;voidgt; retrieveLostData() асинхронный { окончательный ответ на потерянные данные = ожидание выбора.retrieveLostData(); если (response.isEmpty) { возврат; } если (ответ. файл != null) { файл. значение = файл ответа; печать(«второе изменение»); } еще { Получена ошибка.значение = ответ.исключение! .код; } } «
2. Использование этого указано в Документации.