如何将imagePath更改为文件



我拍了一张照片,它被存储在一个临时目录中,这样在发布之前就可以在预览屏幕上查看。我正在想办法把这个imagePath变成一个文件,这样它就可以存储在Firebase中。

这是拍照的功能

_onCapturePressed(context) async {
// Take the Picture in a try / catch block. If anything goes wrong,
// catch the error.
try {
// Attempt to take a picture and log where it's been saved
final path = join(
// In this example, store the picture in the temp directory. Find
// the temp directory using the `path_provider` plugin.
(await getTemporaryDirectory()).path,
'${DateTime.now()}.png',
);
//print(path);
await controller.takePicture(path);
imagePath = path;
// If the picture was taken, display it on a new screen
Navigator.push(
this.context,
MaterialPageRoute(
builder: (context) => displayStoryUploadScreen(),
),
);
} catch (e) {
// If an error occurs, log the error to the console.
print(e);
}
}

这是用于预览图片的displayUploadScreen功能。

imageFile通过";正文:";

displayStoryUploadScreen() {
print(imagePath);
//Navigator.pop(context);
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.white,
iconTheme: IconThemeData(color: Colors.blue),
title: Text(
"Preview",
style: TextStyle(
color: Colors.blue,
fontSize: 22.0,
),
),
actions: <Widget>[
IconButton(
icon: Icon(
Icons.done,
color: Colors.blue,
size: 30.0,
),
onPressed: () => controlUploadAndSave(),
),
],
),
// The image is stored as a file on the device. Use the `Image.file`
// constructor with the given path to display the image.
body: Image.file(File(imagePath),
//decoration: BoxDecoration(image: DecorationImage(image: FileImage(file), fit: BoxFit.cover)),
),
);
}

这是我需要帮助的保存功能。我需要将imagePath作为一个文件,这样这个部分就可以工作,并且我可以添加将照片保存到Firebase的逻辑。

controlUploadAndSave() async {
setState(() {
uploading = true;
});
await compressingPhoto();
String downloadUrl = await uploadPhoto(file);
savePostInfoToFireStore(url: downloadUrl);
setState(() {
file = null;
uploading = false;
storyPostId = Uuid().v4();
});
}

实际上您已经完成了这项工作。使用File(path)从给定路径返回一个文件。

编辑:基于额外信息的更多详细信息:

你真的应该在你的状态下使用更多的参数,而不是值,但最终这取决于你。基本上,您需要做的是将imagePath作为参数(或者File(imagePath),如果您不想在函数中转换它的话(传递给controlUploadAndSave

此外,您提到您的imagePath为空时存在问题。实际上,我不知道Flutter在将函数传递到页面路由时是否有效。这是不正常的,您应该创建小部件,而不是返回小部件的函数。但是,您也可以将imagePath作为参数传递到此处。

主要问题是使用函数而不是小部件。您应该为新屏幕(ConfirmationScreen(提供一个单独的小部件(如果需要,可以使用单独的状态(。然后你可以使用类似的东西:

MaterialPageRoute(
builder: (context) => ConfirmationScreen(imageFile: File(imagePath)),
),

将您的图像发送到此小部件。一旦您完成了该屏幕并想返回到上一个屏幕,您可以简单地弹出导航器并可选地包含一个值。该值将作为未来值返回到您调用Navigator.push的位置。

相关内容

  • 没有找到相关文章

最新更新