Флаттер: как перейти на новую страницу после выбора изображения с помощью плагина ImagePicker? - PullRequest
1 голос
/ 18 октября 2019

Я использую плагин 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 (), сохраните ссылку на предка, вызвав метод attributeitFromWidgetOfExactType () в виджете didChangeDependencies ().)

1 Ответ

0 голосов
/ 19 октября 2019

Проблема в том, что 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,
                ),
          ),
        );

    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...