Flutter: как мне перейти на новую страницу после выбора изображения с помощью плагина ImagePicker?
Я использую плагин Image Picker, чтобы выбрать изображение. Я хотел бы перейти на новый экран сразу после выбора изображения, но оно не работает. Я получаю сообщение об ошибке, в котором говорится, что контекст не существует в текущем дереве виджетов.
Ниже мой код.
pickImage(BuildContext context) async {
File pickedImage = await ImagePicker.pickImage(source: ImageSource.camera);
if (pickedImage != null) {
print(pickedImage.path);
if (this.mounted) {
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ViewStory(
localImagePath: pickedImage.path,
),
),
);
}
}
}
Вызовите функцию так:
IconButton(
onPressed: () => pickImage(context),
icon: Icon(
Icons.camera_alt,
color: CustomColors.primary,
size: 100,
),
),
Ниже я получаю сообщение об ошибке:
FlutterError (Поиск предка деактивированного виджета небезопасен. В этот момент состояние дерева элементов виджета больше не стабильно. Чтобы безопасно ссылаться на предка виджета в его методе dispose(), сохраните ссылку на предка, вызвав inheritFromWidgetOfExactType() в методе виджета didChangeDependencies().)
1 ответ
Проблема в том, что context
не может использоваться, если виджет не встроен в экран (установлен). Таким образом, вы должны сохранить ссылку на свой навигатор, пока виджет активен, и тогда вам не нужно будет ссылатьсяcontext
потом. Ваш код будет работать, еслиImagePicker.pickImage()
ждал, пока его Route
был полностью удален из стека, но это не так, поэтому остальная часть вашего кода будет запущена до того, как виджет будет готов.
Я внес некоторые правки в ваш код. Это должно решить вашу проблему:
pickImage(BuildContext context) async {
final navigator = Navigator.of(context);
File pickedImage = await ImagePicker.pickImage(source: ImageSource.camera);
if (pickedImage != null) {
print(pickedImage.path);
await navigator.push(
MaterialPageRoute(
builder: (context) =>
ViewStory(
localImagePath: pickedImage.path,
),
),
);
}
}