使用ImagePicker从画廊保存Flutter图片

时间:2020-11-07 08:29:06

标签: flutter dart

我具有此功能来保存图库中的图像并将其显示为背景:

Future _getImage() async {
// ImagePicker picker = ImagePicker();

PickedFile pickedFile = await picker.getImage(source: ImageSource.gallery);

if (pickedFile == null) return;
File tmpFile = File(pickedFile.path);
tmpFile = await tmpFile.copy(tmpFile.path);

setState(() {
  if (pickedFile != null) {
    //_image = File(pickedFile.path);
    _image = tmpFile;
    print('_image: $_image');
  } else {
    print('No image selected');
  }
});

}

但是在我调用它之后,它说图像为空:

文件:“ / data / user / 0 / com.app.flutter / cache / image_picker5156338879856055755740.jpg”为空,无法加载为图像。

我不确定这里发生了什么,因为它可以在控制台中很好地打印图像,如下所示:

_image:文件:'/data/user/0/com.app.flutter/cache/image_picker5156338879856055740.jpg

所以它意味着它在缓存中,但是由于某种原因,它返回为空并且不会将图像添加到后台:

 decoration: BoxDecoration(
      image: DecorationImage(
        image: _image == null
            ? MemoryImage(kTransparentImage)
            : FileImage(_image),
        fit: BoxFit.cover,

添加了构建,以防万一出现错误,但是我认为不存在错误。基本上,我只需要画廊中的图像即可持久并留在应用程序中即可。

编辑:将setState()添加到代码中,但是它仍然不是持久性的,一定是我缺少的东西:

Future _getImage() async {
// ImagePicker picker = ImagePicker();

PickedFile pickedFile = await picker.getImage(source: ImageSource.gallery);

if (pickedFile == null) {
  return null;
}

Directory appDirectory = await getApplicationDocumentsDirectory();
File newImage = File(appDirectory.path + 'fileName');
newImage.writeAsBytes(File(pickedFile.path).readAsBytesSync());

setState(() {
  _image = newImage;
  print(newImage.path + ' test');
});

}

2 个答案:

答案 0 :(得分:1)

尝试一下

Future _getImage() async {
  ImagePicker picker = ImagePicker();
  final pickedFile = await picker.getImage(source: ImageSource.gallery);
  if (pickedFile == null) {
    return null;
  }
  Directory appDirectory = await getApplicationDocumentsDirectory();
  File newImage = File(appDirectory.path + 'fileName');
  await newImage.writeAsBytes(File(pickedFile.path).readAsBytesSync());

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

答案 1 :(得分:0)

没关系,我设法通过SharedPreferences使它持久化,我简单地做了两个不同的函数,每个函数用于保存或加载图像,并将_loadImage()添加到initState

(defn render-image [message]
  (let [width 200 height 200
        bi (java.awt.image.BufferedImage. width height java.awt.image.BufferedImage/TYPE_INT_ARGB)
        font (java.awt.Font. "TimesRoman" java.awt.Font/BOLD 20)
        ig (doto ^java.awt.Graphics2D (.createGraphics bi) (.setFont font))
        metrics (.getFontMetrics ig)
        str-width (.stringWidth metrics message)
        str-height (.getAscent metrics)]
    (doto ig
      (.setPaint java.awt.Color/BLACK)

      ;; Compiler complains if x- and y-arguments to .drawString
      ;; are not integers. Why?
      (.drawString message
                   (int (/ (- width str-width) 2))
                   (int (+ (/ height 2) (/ str-height 4)))))
    
    bi))

(defn -main [filename]
  (-> (render-image "Hello world")
      (javax.imageio.ImageIO/write "PNG" (java.io.File. filename))))

}