Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 导航到新屏幕时,如何暂停相机?_Flutter_Dart - Fatal编程技术网

Flutter 导航到新屏幕时,如何暂停相机?

Flutter 导航到新屏幕时,如何暂停相机?,flutter,dart,Flutter,Dart,我正在为颤振应用程序创建条形码扫描仪功能。大部分工作都是由FlatterFire的优秀员工完成的,我正在使用他们在github上的示例,在这里可以找到 我的问题:当发现条形码时,最好的方法是什么?当用户按下返回键时,最好的方法是离开屏幕,而不离开相机扫描或在后台处于活动状态 编辑 问题在于暂停\u camera.startImageStream和ScannerUtils.detect(功能) 在等待Navigator.push之后,我尝试调用了\u initializeCamera函数,但在视图

我正在为颤振应用程序创建条形码扫描仪功能。大部分工作都是由FlatterFire的优秀员工完成的,我正在使用他们在github上的示例,在这里可以找到

我的问题:当发现条形码时,最好的方法是什么?当用户按下返回键时,最好的方法是离开屏幕,而不离开相机扫描或在后台处于活动状态

编辑

问题在于暂停
\u camera.startImageStream
ScannerUtils.detect(
功能)


在等待Navigator.push之后,我尝试调用了
\u initializeCamera
函数,但在视图准备就绪之前,初始化函数似乎没有完成。

据我所知,他们会为您处理所有内容,因此,如果您不再使用他们的小部件,所有内容都会正确处理

下面是我要说的代码:

@override
  void dispose() {
    _camera.dispose().then((_) {
      _barcodeDetector.close();
      _faceDetector.close();
      _imageLabeler.close();
      _cloudImageLabeler.close();
      _recognizer.close();
      _cloudRecognizer.close();
    });

    _currentDetector = null;
    super.dispose();
  }
事实上,当一个对象从窗口小部件树中移除时,它会调用它的方法dispose。所以程序员用它来关闭那些不再有用的东西(比如你的相机)

请检查以了解有关dispose的更多信息

使用导航器发出警告。按

如果您使用Navigator.push,flatter不会破坏小部件。在调用Navigator.push时,您应该使用deactivate方法来执行某些操作。在这里,您可以调用dispose方法 或者将变量_isVIsible设置为false从树中隐藏它。
否则,只需使用Navigator.pushReplacement,它将按预期处理小部件。

在导航到新屏幕之前,我已通过调用此函数解决了此问题:

void closeCameraAndStream() async {
  if (_camera.value.isStreamingImages) {
    await _camera.stopImageStream();
}
await _camera.dispose();

setState(() {
  _camera = null;
  _scanResults = null;
});
}
此外,我在返回屏幕时使用以下命令重新初始化相机:

Navigator.of(context)
            .push(MaterialPageRoute(builder: (BuildContext routeContextcontext) => BarcodeResultScreen(barcodeValue)))
            .then((value) {
          _initializeCamera();
        });
我不能评论

我测试了露露点的答案,它对我有效

代码已定制如下

@override
void dispose() {
_camera.dispose().then((_) {
  _camera = null;
 });
  super.dispose();
}

在视频无法正常运行之前,请不要观看视频。

这可能是您正在寻找的东西。这看起来很有希望,谢谢您的帮助。我还担心FirebaseVision图像检测器。这是一个名为onInit的函数。谢谢您的帮助!但是,我不想处理该小部件,因为我不相信这就是在flatter中应该怎么做。也许我错了,我很想知道!那么你认为我应该在小部件中调用dispose方法吗?你不必自己处理它,但是如果你从小部件树中删除它,它将调用它的dispose方法(如我给你的链接中所解释的).好的,当我导航到另一个屏幕时,一切都将保持初始化和扫描/运行,对吗?颤振的理念是不断地从小部件树中添加/删除小部件,这是为了高效地这样做。我建议您观看这段视频,颤振团队比我解释得更好: