Flutter GETX: как обновить данные Get.defaultDialog(...) с контроллера

Кнопка открывает диалоговое окно предупреждения с помощью GETX (Get.defaultDialog), и у меня есть кнопка выбора изображения с Image.File(...) в диалоговом окне, и когда я выбираю изображение из галереи, изображение не обновляется, только если я оставлю диалоговое окно и открыть другое Я хочу обновить Image.File после выбора изображения с помощью GETX

Я пробовал обновить(); в функции контроллера не обновлялся, и я утомил GetxBuilder в диалоговом окне, но я получаю сообщение об ошибке

первый файл

imageController controller = Get.put(imageController());
alertAddProduct() {
  Get.defaultDialog(
      title: "Add product",
      middleText: "Add product",
      //radius: 20,
      barrierDismissible: false,
      content: Column(
        children: [
          Container(
            child: controller.imagePath != null ? Image.file(controller.imagePath,errorBuilder: (context, error, stackTrace) {
            return const Text("Bruh");
          },): const Text("Pick image")
          ),
          ElevatedButton(
            onPressed: () {
              controller.getImage();
            },
            child: const Text("Select image"),
          )
        ]
      ),
      actions: [
        ElevatedButton(
            onPressed: () {
              // working on it
            },
            child: const Text("Yes")),
        ElevatedButton(
          onPressed: () {
            Get.back();
          },
          child: const Text("No"),
        ),
      ],);
}

и файл контроллера

import 'dart:io';

import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';

class imageController extends GetxController {
  // ignore: prefer_typing_uninitialized_variables
  var imagePath;
  void getImage() async {
  final ImagePicker picker = ImagePicker();
  final XFile? image = await picker.pickImage(
    source: ImageSource.gallery,    
    );
  if (image != null) {
    print("----------------------------" + image.path);
    imagePath = File(image.path);
    update();
  } else {
    print("---------------------------- Please select image");
  }
}


}

и основной файл

floatingActionButton: FloatingActionButton(
        elevation: 5,
        onPressed: (() {
          alertAddProduct();
        }),
        child: const Icon(Icons.add),
      ),

можешь поделиться кодом здесь

Midlaj Nazar 10.04.2023 14:26

@MidlajNazar Я обновил вопрос с кодами, пожалуйста, помогите мне

fhsdjkfas 10.04.2023 14:38
0
2
118
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы пытаетесь внести какие-либо обновления в диалоговое окно update(); метод не будет работать, потому что, пока я не знаю, этот метод может обновлять только контекст, а не какое-либо наложение, поэтому, если вы хотите обновить изображение после выбора «Показать» в диалоговом окне, вам нужно перестроить его, чтобы оно могло отражать ваше изображение.

showDialog(
  context: context,
  builder: (context) {
    String contentText = "Content of Dialog";
    return StatefulBuilder(
      builder: (context, setState) {
        return AlertDialog(
          title: Text("Title of Dialog"),
          content: Text(contentText),
          actions: <Widget>[
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: Text("Cancel"),
            ),
            TextButton(
              onPressed: () {
                setState(() {
                  contentText = "Changed Content of Dialog";
                });
              },
              child: Text("Change"),
            ),
          ],
        );
      },
    );
  },
);

Я хочу обновить его с помощью getx, но я попробую это

fhsdjkfas 10.04.2023 15:02

вы можете использовать то же самое, просто начните с StatefulBuilder вместо того, чтобы начинать с столбца []

MohitJadav86 10.04.2023 15:07

измените переменную imagePath на obs и оберните пользовательский интерфейс OBX

например: В контроллере

var imagePath = ''.obs ;
....
imagePath.value = File(image.path);
// update ---> remove update line

В пользовательском интерфейсе оберните Obx, например:

....
Obx(()=>Container(
child: 
//Add string instead of null on comparing 
controller.imagePath.value != '' ? 
Image.file(controller.imagePath.value,errorBuilder: 
(context, error, stackTrace) {
return const Text("Bruh");},) : const Text("Pick 
image")
)),
....

Другие вопросы по теме