Есть ли альтернатива зависимости image_picker_saver - PullRequest
1 голос
/ 20 мая 2019

Я работаю над кодом для загрузки изображения на устройство, но есть несовместимости androidx с зависимостью image_picker_saver. Так может кто-нибудь предложить альтернативу для этого?

The complete code-
     _saveImage(imageNames) async {
await PermissionHandler()
    .checkPermissionStatus(PermissionGroup.storage)
    .then((status) async {
  if (status == PermissionStatus.denied ||
      status == PermissionStatus.disabled ||
      status == PermissionStatus.unknown) {
    await PermissionHandler().requestPermissions(
        [PermissionGroup.storage]).then((status1) async {
      if (status1.containsValue(PermissionStatus.granted)) {
        await get(imageNames).then((res) async {
          await ImagePickerSaver.saveFile(fileData: res.bodyBytes)
              .then((str) {
            File.fromUri(Uri.file(str));
            Fluttertoast.showToast(
                msg: "Saved to gallery!",
                toastLength: Toast.LENGTH_LONG,
                gravity: ToastGravity.BOTTOM,
                timeInSecForIos: 1,
                backgroundColor: Colors.green,
                textColor: Colors.white,
                fontSize: 15.0);
          });
        });
      }
    });
  } else if (status == PermissionStatus.granted) {
    await get(imageNames).then((res) async {
      await ImagePickerSaver.saveFile(fileData: res.bodyBytes).then((str) {
        File.fromUri(Uri.file(str));
        Fluttertoast.showToast(
            msg: "Saved to gallery!",
            toastLength: Toast.LENGTH_LONG,
            gravity: ToastGravity.CENTER,
            timeInSecForIos: 1,
            backgroundColor: Colors.green,
            textColor: Colors.white,
            fontSize: 15.0);
      });
    });
  }
});

}

1 Ответ

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

Вам нужен пакет для алгоритмов декодирования / кодирования. Я предлагаю этот канонизированный пакет: https://pub.dev/packages/image

Мы будем использовать его.

import 'dart:io' as io;
import 'package:http/http.dart' as http;
import 'package:image/image.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

Нам нужны bodyBytes для записи файла из файла сетевого образа:

Future<dynamic> downloadImage() async =>
    await http.get(url).then((response) => response.bodyBytes);

Получить рабочий каталог приложения:

Future<String> createDir() async =>
    await getApplicationDocumentsDirectory().then((dir) => dir.path);

Сначала мы создадим переменную типа [Image], которая предоставляется пакетом изображений, затем мы преобразуем ее в файл, как декодирование, так и кодирование, предоставляемое пакетом изображений снова:

Future<io.File> writeFile(String path, var bodyBytes, String fileName) async {
  Image image = decodeImage(bodyBytes);
  io.File file = io.File(join(path, fileName));
  file.writeAsBytesSync(encodePng(image));
  return file;
}

Итак, вы создали свои файлы, вам нужно загрузить их, это тот метод, который вам нужен (вы можете использовать восстановленные изображения с помощью виджета [Image.file]):

Future<List<io.File>> loadFiles() async {
  List<io.File> images = <io.File>[];
  final io.Directory dir = await getApplicationDocumentsDirectory();
  print('path: ${dir.path}');
  for (io.FileSystemEntity f in dir.listSync()) {
    if (f is io.File) {
      if (f.path.contains('.jpg')) { //any format you want
        images.add(f);
      }
    }
  }
  return images;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...