Flutter: отображение изображения из строки URI или объекта File - PullRequest
0 голосов
/ 21 мая 2019

Я вытягиваю изображение из моей галереи, используя ImagePicker, вот так:

ImageProvider backgroundImage;
String customImageFile;
File _image;

Future getImage() async {
  var image = await ImagePicker.pickImage(source: ImageSource.gallery);

  setState(() {
    _image = image;
  });

  customImageFile = _image.toString();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('customImageFile', customImageFile);
}

Как вы можете видеть, я пытаюсь сохранить URI файла изображения в SharedPreferences для сохранения, и я отображаюв моем приложении это выглядит так:

Container(
  decoration: BoxDecoration(
    color: Colors.blueAccent,
      image: DecorationImage(
        image: _image == null ? backgroundImage :  FileImage(_image),
        fit: BoxFit.fill,
      ),
    ),
),

Проблема заключается в том, что я не могу получить строковое значение customImageFile для правильной загрузки изображения.

РЕДАКТИРОВАТЬ: На самом деле, я могу иметьнаткнулся на причину, я не заметил этого, пока я не использовал дамп печати строки.Фактическая строка выглядит так:

File: '/storage/emulated/0/Download/images.jpeg'

Вместо просто:

'/storage/emulated/0/Download/images.jpeg'

Это может просто сработать, если я смогу поиграть со строкой здесь.У меня возникают проблемы с поиском в Интернете информации о том, как игнорировать первые 6 символов строки.Было довольно легко сделать это в Java и в Visual Basic, но я не могу найти метод.

ОБНОВЛЕНИЕ: удалось сократить строку до:

'/storage/emulated/0/Download/images.jpeg'

Используя:

customImageFile = customImageFile.substring(6);

Но теперь он показывает мне эту ошибку:

Cannot open file, path = ''/storage/emulated/0/Download/images.jpeg'' (OS Error: No such file

Таким образом, я могу увеличить значение подстроки до 7, чтобы удалить первый апостроф, как мне удалить последний символСтрока

Ответы [ 3 ]

0 голосов
/ 21 мая 2019

Я включил URL-адрес запроса непосредственно в мой виджет Image.network (), и он сработал.

Вот код:

Widget _buildImage() {

    return FadeInImage(
      image: NetworkImage(
          'https://www.google.com/url?sa=i&source=images&cd=&ved=2ahUKEwik1L3zwqziAhXRZCsKHSWiDYsQjRx6BAgBEAU&url=https%3A%2F%2Funsplash.com%2Fsearch%2Fphotos%2Fcountry&psig=AOvVaw2SLubeS_2uHAib1sXXcfRX&ust=1558524613660099'),

    );
  }

И для класса изображений есть файловый конструктор для этого-

https://docs.flutter.io/flutter/widgets/Image/Image.file.html

Image.file(File(path))
0 голосов
/ 21 мая 2019

Хорошо, так что я наконец-то все заработал и предоставлю здесь полные разделы кода для всех, кто хочет это сделать:

Извлечение изображения из галереи с помощью ImagePicker и сохранение URI в SharedPreferencesдля сохранения:

ImageProvider backgroundImage;
String customImageFile;
File _image;

  Future getImage() async {
   var image = await ImagePicker.pickImage(source: ImageSource.gallery);

   setState(() {
     _image = image;
   });

   customImageFile = _image.toString();
   SharedPreferences prefs = await SharedPreferences.getInstance();
   prefs.setString('customImageFile', customImageFile);
}

Как отобразить изображение в методе сборки, где backgroundImage - это заполнитель, который вы хотите отобразить до того, как пользователь выберет пользовательский файл:

Container(
  decoration: BoxDecoration(
    color: Colors.blueAccent,
    image: DecorationImage(
      image: _image == null ? backgroundImage :  FileImage(_image),
      fit: BoxFit.fill,
    ),
  ),
),

Теперь customImageFileне будет подходящим значением String для того, чтобы снова найти это изображение из галереи, поэтому нам нужно отредактировать String, чтобы оно выглядело как то, что мы можем использовать.Исходная строка customImageFile:

File: '/storage/emulated/0/Download/images.jpeg'

Исправление:

customImageFile = customImageFile.substring(6);
customImageFile = customImageFile.replaceAll("'", "");

Теперь наша строка выглядит так:

/storage/emulated/0/Download/images.jpeg

Что мы можем сделать сейчасИспользуйте предыдущие предложения, например, так:

setState(() {
  _image =  File(customImageFile);
});

Протестировано и работает нормально.Так что теперь мы можем использовать строку, которую мы храним в SharedPreferences, чтобы загрузить ранее выбранное изображение при запуске приложения.Я помещаю метод loadPreferences () в initState (), который обрабатывает все подобные вещи, работает с удовольствием.

Надеюсь, это кому-нибудь поможет, потому что я не смог ничего найти в Интернете по этому поводу.

0 голосов
/ 21 мая 2019

Вы должны сначала проверить, существует ли файл по этому пути. Затем вы можете загрузить изображение с помощью конструктора файлов, как показано ниже.

var file = File(imagePath);
if(file.existsSync()){
    return Image.file(file);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...