Как я могу реализовать пакет image_picker с помощью Getx?

#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. Использование этого указано в Документации.