Flutter 颤振桌面Linux-映像缓存问题

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(

我正在运行Ubuntu21.04的Raspberry Pi 4,4GB上为Linux构建一个Flitter桌面应用程序。该软件的目标是使用Raspberry Pi摄像头模块拍摄照片,然后将其上传到服务器。 图像采集过程工作正常,我可以使用pub.dev上的Raspicam插件拍照。 我想实现的可能性,检查之前上传的图像,并可能会重新采取它。我正在将图像保存到工作区文件夹(资源的子文件夹)。拍照后,我会:

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),
            ),
          ),
        ],
      ),
    );
  }
}