Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 - Fatal编程技术网

Flutter 如何正确获取可用的摄像头

Flutter 如何正确获取可用的摄像头,flutter,Flutter,因此,我一直在尝试几种不同的解决方案,但似乎没有一种真正起作用。我试图创建一个自拍功能,也有一些覆盖 我正在使用fluro进入我创建的自拍屏幕,在那里我想使用相机 我尝试了多种方法,比如setState((){})和下面的方法。 但我好像没有相机。如果我尝试相机软件包附带的demp应用程序,它工作得非常好 我只是不知道如何在一个单独的组件文件中获得可用的相机。在应用程序初始化期间,仍然有一种方法可以获取摄像头,并将摄像头从应用程序构造函数一直传递到我需要的组件。但这似乎是一种不好的做法 有谁有更

因此,我一直在尝试几种不同的解决方案,但似乎没有一种真正起作用。我试图创建一个自拍功能,也有一些覆盖

我正在使用fluro进入我创建的自拍屏幕,在那里我想使用相机

我尝试了多种方法,比如
setState((){})和下面的方法。
但我好像没有相机。如果我尝试
相机
软件包附带的demp应用程序,它工作得非常好

我只是不知道如何在一个单独的组件文件中获得可用的相机。在应用程序初始化期间,仍然有一种方法可以获取摄像头,并将摄像头从应用程序构造函数一直传递到我需要的组件。但这似乎是一种不好的做法

有谁有更好的方法吗

这是我的
自拍组件.dart
文件

import'包:camera/camera.dart';
进口“包装:颤振/材料.省道”;
类SelfiePage扩展StatefulWidget{
@凌驾
State createState()=>new SelfiePageState();
}
类SelfiePageState扩展了状态{
摄像机控制器(CameraController)摄像机;;
CameraLensDirection _direction=CameraLensDirection.back;
@凌驾
void initState(){
super.initState();
_initializeCamera();
}
Future\u getCamera(CameraLensDirection dir)异步{
返回wait wait availableCameras()。然后(
(列出摄影机)=>camers.firstWhere(
(CameradDescription摄像机)=>camera.lensDirection==dir,
),
);
}
void _initializeCamera()异步{
_摄像机=摄像机控制器(
等待获取摄像头(_方向),
ResolutionPreset.medium,
);
打印(用照相机);
等待_camera.initialize();
}
最终GlobalKey _scaffoldKey=GlobalKey();
@凌驾
小部件构建(构建上下文){
归还新脚手架(
钥匙:_scaffoldKey,
正文:专栏(
儿童:[
扩大(
子:容器(
孩子:填充(
填充:常数边集全部(1.0),
儿童:中心(
子项:\u cameraPreviewWidget(),
),
),
),
),
],
),
);
}
///显示相机的预览(如果预览不可用,则显示消息)。
小部件\u cameraPreviewWidget(){
如果(_camera==null | |!_camera.value.isInitialized){
返回常量文本(
“点击相机”,
样式:TextStyle(
颜色:颜色,白色,
字体大小:24.0,
fontWeight:fontWeight.w900,
),
);
}否则{
返回AspectRatio(
aspectRatio:_camera.value.aspectRatio,
儿童:CameraPreview(_camera),
);
}
}
}
我已经解决了我的问题

我制作了一个单独的
selfie\u camara\u widget.dart
文件

导入'dart:async';
导入“dart:io”;
导入“包:摄像机/摄像机.dart”;
导入“package:path_provider/path_provider.dart”;
进口“包装:颤振/材料.省道”;
类SelfieCameraWidget扩展StatefulWidget{
静态SelfieCameraWidgetState(BuildContext上下文)=>
anteStorStateofType(const TypeMatcher());
@凌驾
State createState()=>新的SelfieCameraWidgetState();
}
类SelfieCameraWidgetState扩展状态{
列出摄像机;
摄像机控制器;
bool isReady=false;
bool-noCameraDevice=false;
int selectedCamera=1;
最终GlobalKey _scaffoldKey=GlobalKey();
@凌驾
void initState(){
super.initState();
_设置摄像头();
}
Future\u setupCamera()异步{
试一试{
//初始化摄像机。
摄像头=等待可用摄像头();
//初始化相机控制器。
控制器=新的CameraController(
摄像机[所选摄像机],分辨率预设.medium
);
等待控制器初始化();
}关于CameraException捕获(\u1){
debugPrint(“发生了一些错误!”);
}
如果(!已安装){
返回;
}
设置状态(){
isReady=真;
});
}
@凌驾
小部件构建(构建上下文){
if(controller==null | |!controller.value.isInitialized){
返回新容器();
}
返回新AspectRatio(
aspectRatio:controller.value.aspectRatio,
子女:新的CameraPreview(控制员));
}
字符串时间戳()=>DateTime.now().millissecondssinceepoch.toString();
void showinsnakbar(字符串消息){
_scaffoldKey.currentState.showSnackBar(SnackBar(内容:文本(消息)));
}
无效日志错误(字符串代码、字符串消息)=>
打印('错误:$code\n错误消息:$Message');
void toggleCamera(){
设置状态(){
selectedCamera=(selectedCamera==1)?0:1;
_设置摄像头();
});
}
Future takePicture()异步{
如果(!controller.value.isInitialized){
ShowInNackBar('错误:先选择一个摄像头');
返回null;
}
最终目录extDir=wait getApplicationDocumentsDirectory();
最终字符串dirPath='${extDir.path}/Pictures/trekker_trek';
等待目录(dirPath).create(递归:true);
最终字符串filePath='$dirPath/${timestamp()}.jpg';
if(controller.value.picture){
//捕获已挂起,请不要执行任何操作。
返回null;
}
试一试{
等待控制器。拍摄照片(文件路径);
}关于CameraException捕获(e){
_showCameraException(e);
返回null;
}
返回文件路径;
}
void\u showCameraException(CameraException e){
日志错误(e.代码,e.说明);
showinsnakbar('Error:${e.code}\n${e.description}');
}
}
然后在正确的屏幕上导入它并调用SelfieCameraWidget()