Flutter 导航到新屏幕时,如何暂停相机?
我正在为颤振应用程序创建条形码扫描仪功能。大部分工作都是由FlatterFire的优秀员工完成的,我正在使用他们在github上的示例,在这里可以找到 我的问题:当发现条形码时,最好的方法是什么?当用户按下返回键时,最好的方法是离开屏幕,而不离开相机扫描或在后台处于活动状态 编辑 问题在于暂停Flutter 导航到新屏幕时,如何暂停相机?,flutter,dart,Flutter,Dart,我正在为颤振应用程序创建条形码扫描仪功能。大部分工作都是由FlatterFire的优秀员工完成的,我正在使用他们在github上的示例,在这里可以找到 我的问题:当发现条形码时,最好的方法是什么?当用户按下返回键时,最好的方法是离开屏幕,而不离开相机扫描或在后台处于活动状态 编辑 问题在于暂停\u camera.startImageStream和ScannerUtils.detect(功能) 在等待Navigator.push之后,我尝试调用了\u initializeCamera函数,但在视图
\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方法(如我给你的链接中所解释的).好的,当我导航到另一个屏幕时,一切都将保持初始化和扫描/运行,对吗?颤振的理念是不断地从小部件树中添加/删除小部件,这是为了高效地这样做。我建议您观看这段视频,颤振团队比我解释得更好: