Flutter 颤振桌面Linux-映像缓存问题
我正在运行Ubuntu21.04的Raspberry Pi 4,4GB上为Linux构建一个Flitter桌面应用程序。该软件的目标是使用Raspberry Pi摄像头模块拍摄照片,然后将其上传到服务器。 图像采集过程工作正常,我可以使用pub.dev上的Raspicam插件拍照。 我想实现的可能性,检查之前上传的图像,并可能会重新采取它。我正在将图像保存到工作区文件夹(资源的子文件夹)。拍照后,我会:Flutter 颤振桌面Linux-映像缓存问题,flutter,flutter-desktop,Flutter,Flutter Desktop,我正在运行Ubuntu21.04的Raspberry Pi 4,4GB上为Linux构建一个Flitter桌面应用程序。该软件的目标是使用Raspberry Pi摄像头模块拍摄照片,然后将其上传到服务器。 图像采集过程工作正常,我可以使用pub.dev上的Raspicam插件拍照。 我想实现的可能性,检查之前上传的图像,并可能会重新采取它。我正在将图像保存到工作区文件夹(资源的子文件夹)。拍照后,我会: await Navigator.of(context).push(
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => PictureDisplayScreen(
imgPath: imgPath,
),
),
);
图像显示正确。我正在努力使用重拍功能。如果我想重新拍摄照片,我只需使用dart:io附带的文件(imgPath).delete()
函数删除拍摄的图像,然后返回拍摄照片的屏幕
由于这是不正常工作(删除的图像显示),我想我可能需要清除缓存。我的工作如下:
imageCache!.clear();
imageCache!.clearLiveImages();
缓存被清除,图像被删除。如果我重新拍摄图片并再次推到显示屏,我会得到错误“文件或目录不存在”,尽管图像存在于目录中
以下是两个文件:
用于拍照的扫描屏幕:
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);
}
},
));
}
}
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,
height: 50,
child: ElevatedButton(
onPressed: () {
print('Bild Bestätigt');
},
child: Text('Scan Bestätigen')),
),
],
),
Center(
child: Image.file(
File(imgPath),
),
),
],
),
);
}
}