Как преобразовать изображение актива в файл? - PullRequest
1 голос
/ 22 марта 2019

Есть ли способ использовать изображение актива в качестве файла. Мне нужен файл, чтобы его можно было использовать для тестирования через Интернет по протоколу http. Я попробовал некоторые ответы от Stackoverflow.com ( Как загрузить изображения с image.file ), но получил ошибку «Невозможно открыть файл (Ошибка ОС: нет такого файла или каталога, errno = 2)» , Прикрепленная строка кода также выдает ошибку.

File f = File('images/myImage.jpg');

RaisedButton(
   onPressed: ()=> showDialog(
     context: context,
     builder: (_) => Container(child: Image.file(f),)),
   child: Text('Show Image'),)

Использование виджета Image.memory (работает)

Future<Null> myGetByte() async {
    _byteData = await rootBundle.load('images/myImage.jpg');
  }

  /// called inside build function
  Future<File> fileByte = myGetByte();

 /// Show Image
 Container(child: fileByte != null
 ? Image.memory(_byteData.buffer.asUint8List(_byteData.offsetInBytes, _ 
 byteData.lengthInBytes))
 : Text('No Image File'))),

1 Ответ

2 голосов
/ 22 марта 2019

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

import 'dart:async';
import 'dart:io';

import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';

Future<File> getImageFileFromAssets(String path) async {
  final byteData = await rootBundle.load('assets/$path');

  final file = File('${(await getTemporaryDirectory()).path}/$path');
  await file.writeAsBytes(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));

  return file;
}

В вашем примере вы бы назвали эту функцию следующим образом:

File f = await getImageFileFromAssets('images/myImage.jpg');

Для получения дополнительной информации о записи байтовых данных, проверьте этот ответ .

Вам понадобится await Future, и для этого сделайте функцию async:

RaisedButton(
   onPressed: () async => showDialog(
     context: context,
     builder: (_) => Container(child: Image.file(await getImageFileFromAssets('images/myImage.jpg')))),
   child: Text('Show Image'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...