保存 ImagePicker 文件路径并将其用作背景
Save ImagePicker File path and Use it as Background
我正在开发一个 flutter 应用程序,它允许用户设置他们选择的背景图片和 "stays permanently till the user changes it"。
使用 Image.file(pickedImage) 是暂时的,如果用户离开页面,returns 返回图像将被关闭。
我已经实现了图像选择器,我尝试将图像文件存储在 sharedpreferences 中,但我错了 ImagePicker returns 图像文件而不是图像文件路径。
如何获取选取的图像文件路径并将其用作背景?
当 ImagePicker returns 一个文件时,它 returns 一个 File 对象,如您所指出的。此文件在应用程序外部,并且可能是临时文件(即它可能随时 moved/deleted/etc)- 它可能会持续一段时间,但您不应该依赖它。
相反,在用户选择图像后,您应该将其复制到应用程序的存储目录,然后从那里访问它。
为此,请按照 flutter reading/writing files documentation. But basically, what you want to be doing is getting the local directory using the getApplicationDocumentsDirectory
method of the path_provider library 中的说明进行操作,然后调用 file.copy(<path under application document directory>)
,文件是您从图像选择器收到的文件,应用程序文档目录下的路径是您想要的任何路径.
即
var image = await ImagePicker.pickImage(source: ImageSource.camera);
Directory appDocDir = await getApplicationDocumentsDirectory();
String bgPath = appDocDir.uri.resolve("background.jpg").path;
File bgFile = await image.copy(bgPath);
一旦你有了那个文件,你要做的就是将 bgFile 的路径保存到你的 SharedProperties(或者理论上你可以硬编码它并每次覆盖它
加载新图像 - 由您决定,尽管这种方法可能 运行 会出现问题
文件开关)。然后您将从共享属性加载 bg 文件路径并使用它。
希望对您有所帮助 =)。
试试下面的代码:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart' as syspaths;
Future<void> _takePicture() async {
final picker = ImagePicker();
final imageFile = await picker.getImage(
source: ImageSource.camera,
maxWidth: 600,
);
setState(() {
_storedImage = File(imageFile.path);
});
final appDir = await syspaths.getApplicationDocumentsDirectory();
final fileName = path.basename(imageFile.path);
final savedImage = await imageFile.copy('${appDir.path}/$fileName');
}
我正在开发一个 flutter 应用程序,它允许用户设置他们选择的背景图片和 "stays permanently till the user changes it"。
使用 Image.file(pickedImage) 是暂时的,如果用户离开页面,returns 返回图像将被关闭。
我已经实现了图像选择器,我尝试将图像文件存储在 sharedpreferences 中,但我错了 ImagePicker returns 图像文件而不是图像文件路径。
如何获取选取的图像文件路径并将其用作背景?
当 ImagePicker returns 一个文件时,它 returns 一个 File 对象,如您所指出的。此文件在应用程序外部,并且可能是临时文件(即它可能随时 moved/deleted/etc)- 它可能会持续一段时间,但您不应该依赖它。
相反,在用户选择图像后,您应该将其复制到应用程序的存储目录,然后从那里访问它。
为此,请按照 flutter reading/writing files documentation. But basically, what you want to be doing is getting the local directory using the getApplicationDocumentsDirectory
method of the path_provider library 中的说明进行操作,然后调用 file.copy(<path under application document directory>)
,文件是您从图像选择器收到的文件,应用程序文档目录下的路径是您想要的任何路径.
即
var image = await ImagePicker.pickImage(source: ImageSource.camera);
Directory appDocDir = await getApplicationDocumentsDirectory();
String bgPath = appDocDir.uri.resolve("background.jpg").path;
File bgFile = await image.copy(bgPath);
一旦你有了那个文件,你要做的就是将 bgFile 的路径保存到你的 SharedProperties(或者理论上你可以硬编码它并每次覆盖它 加载新图像 - 由您决定,尽管这种方法可能 运行 会出现问题 文件开关)。然后您将从共享属性加载 bg 文件路径并使用它。
希望对您有所帮助 =)。
试试下面的代码:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart' as syspaths;
Future<void> _takePicture() async {
final picker = ImagePicker();
final imageFile = await picker.getImage(
source: ImageSource.camera,
maxWidth: 600,
);
setState(() {
_storedImage = File(imageFile.path);
});
final appDir = await syspaths.getApplicationDocumentsDirectory();
final fileName = path.basename(imageFile.path);
final savedImage = await imageFile.copy('${appDir.path}/$fileName');
}