如何解决Flutter Desktop Linux - 图像缓存问题
我正在运行 Ubuntu 21.04 的 4GB Raspberry Pi 4 上构建适用于 Linux 的 Flutter 桌面应用程序。该软件的目标是使用 Raspberry Pi 摄像头模块拍照,然后将其上传到服务器。 图像采集过程工作正常,我可以使用 pub.dev 上提供的 Raspicam 插件拍照。 我想实现在上传图像之前检查图像的可能性,并可能重新拍摄。我将图像保存到工作区文件夹(资产的子文件夹)。拍完照片后我做:
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PictureDisplayScreen(
imgPath: imgPath,),);
图像显示正确。我正在为重考功能而苦苦挣扎。如果我想重新拍摄照片,我只需使用 dart:io 附带的 File(imgPath).delete()
函数删除拍摄的图像,然后推回我拍摄照片的屏幕。
由于这不能正常工作(显示已删除的图像),我想我可能需要清除缓存。我正在按如下方式执行此任务:
imageCache!.clear();
imageCache!.clearLiveImages();
缓存被清除,图像被删除。如果我重新拍摄图片并再次推送到显示屏幕,尽管目录中存在图像,但我收到错误“文件或目录不存在”。
这是两个文件: 用于拍照的 ScanScreen:
import 'dart:convert';
import 'dart:io';
import 'package:cv_embedded/screens/picture_display_screen.dart';
import 'package:flutter/material.dart';
import 'package:raspicam/raspicam.dart';
class ScanScreen extends StatefulWidget {
static const routeName = '/scan';
Stream<String> readLine() =>
stdin.transform(utf8.decoder).transform(const LineSplitter());
void processLine(String line) {
print(line);
}
@override
_ScanScreenState createState() => _ScanScreenState();
}
class _ScanScreenState extends State<ScanScreen> {
var rpc;
String imgPath = '';
int imgCnt = 0;
@override
@mustCallSuper
void initState() {
print(
'######################\ninitializing.......\n#######################');
super.initState();
clearCaches();
setParams();
}
Future clearCaches() async {
imageCache!.clearLiveImages();
imageCache!.clear();
print('Caches cleared');
}
Future _checkForImage() async {
await File(imgPath).exists();
}
Future _exec() async {
var p1 = await rpc.takePhoto();
print('took a photo $p1');
await rpc.stop();
imgCnt++;
print(imgPath);
}
void setParams() async {
var opts = RaspicamOptions();
opts.previewWidth = 800;
opts.previewHeight = 600;
opts.awb = 'auto';
imgPath = opts.output = 'assets/images/woundImages/test_$imgCnt.jpg';
opts.datetime = false;
print('Params set.');
print(opts());
rpc = Raspicam(opts);
await rpc.start();
print('All set up. Ready to shoot some nice pics');
print(imgPath);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),floatingActionButton: FloatingActionButton(
onPressed: () async {
try {
await _exec();
await _checkForImage();
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PictureDisplayScreen(
imgPath: imgPath,);
} catch (e) {
print(e);
}
},));
}
}
PictureDisplayScreen 用于显示图片(队长明显再次罢工):
import 'dart:io';
import 'package:cv_embedded/screens/scan_screen.dart';
import 'package:flutter/material.dart';
class PictureDisplayScreen extends StatelessWidget {
final String imgPath;
const PictureDisplayScreen({Key? key,required this.imgPath})
: super(key: key);
Future _deleteImage() async {
await File(imgPath).delete();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Row(
children: [
Container(
width: MediaQuery.of(context).size.width / 2,height: 50,child: ElevatedButton(
onPressed: () async {
await _deleteImage();
imageCache!.clear();
imageCache!.clearLiveImages();
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => ScanScreen(),);
},child: Text('Erneut Scannen')),Container(
width: MediaQuery.of(context).size.width / 2,child: ElevatedButton(
onPressed: () {
print('Bild Bestätigt');
},child: Text('Scan Bestätigen')),],Center(
child: Image.file(
File(imgPath),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。