Как обрабатывать Get.аргументы как null в GetxController

#flutter #dart #flutter-getx

Вопрос:

У меня есть следующий контроллер getX для передачи параметров на страницу в Flutter:

обновленный

 class HomeController extends GetxController {

  File image;
  String ocr_text;

  onInit(){
    super.onInit();

    image = Get.arguments['image'];
    ocr_text = Get.arguments['ocr_text'];

    update();
  }

}
 

Связующий:

 class HomeBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut<HomeController>(() => HomeController());
  }
}
 

Я хочу передать изображение со страницы Ocr_details:

 FlatButton(
            color: Colors.blue,
            child: Icon(Icons.save_outlined),
              onPressed: () {
                Get.toNamed(
                  AppRoutes.HOME,
                  arguments: {'image': controller.image, 'ocr_text': controller.text},
                );
              }
          ),

 

на главную страницу:

обновленный:

 Container(
                padding: EdgeInsets.all(32),
                child:  GetBuilder<HomeController>(
                  builder: (_) {
                    return _.image != null
                        ? Image.file(_.image)
                        : Container();
                  },
                ),
              ),
 

Получить страницы

 class AppPages {
  static var list = [
    GetPage(
      name: AppRoutes.HOME,
      page: () => HomePage(),
      binding: HomeBinding(),
    ),
    GetPage(
      name: AppRoutes.PICK_IMAGE,
      page: () => PickImagePage(),
      binding: PickImageBinding(),
    ),
    GetPage(
      name: AppRoutes.OCR_DETAILS,
      page: () => OCRDetailsPage(),
      binding: OCRDetailsBinding(),
    )
  ];
}
 

Маршруты

 class AppRoutes {
  static const String HOME = '/';
  static const String PICK_IMAGE = '/pick_image';
  static const String OCR_DETAILS = '/ocr_details';
}

 

Но я получаю следующую ошибку:
Следующая ошибка noSuchMethod была вызвана на домашней странице(грязная): метод «[] » был вызван с нулевым значением. Получатель: null Попытался позвонить:

Я не знаю, есть ли способ проверить, является ли аргумент нулевым, и продолжить визуализацию виджета?

Комментарии:

1. Когда вы переходите на ГЛАВНУЮ страницу, вы используете виджет наложения, такой как диалоговое окно или что-то еще? потому что у меня была эта ошибка раньше, когда я пытался передать аргументы, чтобы Получить.аргументы из виджетов наложения. Это должно работать нормально, если это с обычной страницы.

Ответ №1:

Во-первых, вы не используете аннотацию @override с помощью OnInit(). Во-вторых, вам нужно изменить функцию GetxController onReady(). On ready будет вызван после загрузки пользовательского интерфейса.

Вместо

 class HomeController extends GetxController {

  File image;
  String ocr_text;

  onInit(){
    super.onInit();

    image = Get.arguments['image'];
    ocr_text = Get.arguments['ocr_text'];

    update();
  }
}
 

Попробуй:

 class HomeController extends GetxController {

  File image;
  String ocr_text;

  @override
  onReady(){
    super.onReady();

    image = Get.arguments['image'];
    ocr_text = Get.arguments['ocr_text'];

    update();
  }
}
 

Ответ №2:

На странице, где вы хотите получить,

 final args = Get.arguments;


class HomeController extends GetxController {

  final args = Get.arguments;
 
}
Container(
                padding: EdgeInsets.all(32),
                child:  GetBuilder<HomeController>(
                  builder: (_) {
                    return args.image != null
                        ? Image.file(args.image)
                        : Container();
                  },
                ),
              ),],
 

затем, когда вам это понадобится
args.image или args.ocr_text

Комментарии:

1. Большое вам спасибо за помощь, но теперь я получил эту ошибку: геттер «изображение» был вызван на нуль. Получатель: null Попытался позвонить: изображение

2. вероятно, не правильно, выведите(args), затем посмотрите, является ли это объектом, списком или нулем, затем args[‘изображение’] или args.image

Ответ №3:

Вместо этого:

 class HomeController extends GetxController {

   final File image = Get.arguments['image'];
   final String ocr_text = Get.arguments['ocr_text'];

}
 

Используйте это:

 class HomeController extends GetxController {

    File image;
    String ocr_text;

    onInit(){
      super.onInit();

      image = Get.arguments['image'];
      ocr_text = Get.arguments['ocr_text'];
      
      update();
   }

}
 

Обновить

Я вижу, что ты пользуешься controller.image . Вместо controller.image этого вам нужно использовать _.image внутри вашего GetBuilder

Обновление 2 Просто проверьте, Get.arguments не является ли значение null, прежде чем пытаться получить аргументы и назначить.

 class HomeController extends GetxController {

    File image;
    String ocr_text;

    onInit(){
      super.onInit();

      if(Get.arguments != null){
        image = Get.arguments['image'];
        ocr_text = Get.arguments['ocr_text'];
      }
      
   }

}
 

Комментарии:

1. Я получил эту ошибку: Была выдана следующая ошибка noSuchMethod(заполнение: EdgeInsets.all(32.0)): Метод «[] » был вызван при нуле. Получатель: null Попытался позвонить: [](«изображение»)

2. Я вижу, что вы вызываете controller.image, вам следует позвонить _.image

3. Я обновил код, как в первом посте, но все равно получил его ошибку: метод «[] » был вызван на нуль. Получатель: null Попытался позвонить: [](«изображение»)

4. Не могли бы вы, пожалуйста, включить определение ваших маршрутов/GetPages?

5. Добавлены определение маршрутов и страницы получения