#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. Добавлены определение маршрутов и страницы получения