【问题标题】:Saving Flutter image from gallery with ImagePicker使用 ImagePicker 从图库中保存 Flutter 图像
【发布时间】:2020-11-07 08:29:06
【问题描述】:

我有这个功能可以从图库中保存图像并将其显示为背景:

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_picker5156338879856055740.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');
});

}

【问题讨论】:

    标签: flutter dart


    【解决方案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;
      });
    }
    

    【讨论】:

    • 在您的代码下方添加了 setstate,但它仍然没有保持持久性:setState(() { _image = newImage; });
    • 你的意思是它仍然没有保持持久
    • 对不起,它仍然没有保存,当我单击按钮时它会显示,但是当我退出应用程序或更改屏幕时,它会删除,而不是保持缓存。这就是为什么我放入一个打印语句,只是为了看看它是否创建了一个图像路径,它确实,但由于某种原因,它没有被保存。
    【解决方案2】:

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

    void _saveImage(path) async {
    SharedPreferences saveImage = await SharedPreferences.getInstance();
    saveImage.setString('imagepath', path);
    print('Image Saved!');
    
    
    
      void _loadImage() async {
    SharedPreferences saveImage = await SharedPreferences.getInstance();
    setState(() {
      _imagepath = saveImage.getString('imagepath');
    });
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2021-11-19
      • 2022-11-11
      • 2018-10-03
      相关资源
      最近更新 更多