flutter - 无法在颤动中从android模拟器加载相机
问题描述
我正在尝试使用相机插件进行颤振。
我在应用程序的主要功能中调用了 availableCameras(),正如我在这样的文档中看到的:
List<CameraDescription> cameras;
Future<void> main() async {
try {
cameras = await availableCameras();
} catch (e) {
print("Error: $e");
}
runApp(MyApp());
}
try 语句立即打印失败
错误:对空值使用空检查运算符
我在 MyApp() 中调用 Home(),它有一个选项卡式导航器,它像这样调用 FaceAScreen():
return Scaffold(
appBar: buildAppBar(),
bottomNavigationBar: BottomNavBar(tabController: _tabController, myTabs: myTabs),
body: TabBarView(
controller: _tabController,
children: <Widget>[Body(), FaceAScreen(cameras: widget.cameras)],
),
);
我想要 FaceAScreen() 页面中的相机,但它显示,预期,“没有相机!” 文本,因为List cameras
为空。
FaceAScreen() 的代码构建方法是:
@override
Widget build(BuildContext context) {
if (!isDetecting) {
return Center(
child: Container(
margin: EdgeInsets.all(10),
child: Text("No cameras!"),
),
);
}
// This is not what causes the no camera to show on the page
if (!controller.value.isInitialized) {
return Container(child: Text("No cameras"));
}
return AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: CameraPreview(controller),
);
}
我一直在无情地查看空值错误,并多次从终端升级我的颤振包,包括运行颤振清洁。Flutter 医生显示一切正常。我还仔细检查了我的 android 模拟器上的设置,并将正面设置为 webcam0,背面设置为“仿真”。我检查了在模拟器中打开相机应用程序并且有效。所有教程似乎都像我一样使用 availableCameras() 方法(甚至没有 try catch)。任何帮助都会很棒,谢谢!
解决方案
最近我完成了一个教程,它使用相机并且工作正常。下面的代码可以帮助你:
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:flutter_icons/flutter_icons.dart';
class CameraPage extends StatefulWidget {
CameraPage({Key key}) : super(key: key);
@override
_CameraPageState createState() => _CameraPageState();
}
/* ============================================================================================= */
class _CameraPageState extends State<CameraPage> {
List<CameraDescription> _cameras;
CameraController _controller;
var _isReady = false;
/* ---------------------------------------------------------------------------- */
@override
void initState() {
super.initState();
_setUpCamera();
}
/* ---------------------------------------------------------------------------- */
void _setUpCamera() async {
try {
// initialize cameras
_cameras = await availableCameras();
// initialize camera controllers
// Current bug for high/medium with Samsung devices
_controller = CameraController(_cameras[0], ResolutionPreset.medium);
await _controller.initialize();
} on CameraException catch (_) {
// do something on error
}
if (mounted) setState(() => _isReady = true);
}
/* ---------------------------------------------------------------------------- */
Widget cameraPreview() {
return AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: CameraPreview(_controller),
);
}
/* ---------------------------------------------------------------------------- */
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
floatingActionButton: getFooter(),
body: getBody(),
);
}
/* ---------------------------------------------------------------------------- */
Widget getBody() {
final size = MediaQuery.of(context).size;
var flag = !_isReady || _controller == null || !_controller.value.isInitialized;
return Container(
decoration: flag ? BoxDecoration(color: Colors.white) : null,
width: size.width,
height: size.height,
child: flag
? Center(
child: SizedBox(
width: 25,
height: 25,
child: CircularProgressIndicator(strokeWidth: 3),
),
)
: ClipRRect(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10),
),
child: cameraPreview(),
),
);
}
.....
}
显然,您的 Android 设备模拟器必须启用相机和 SD 卡。
推荐阅读
- bash - Sed 在文本出现之后打印方括号中的项目
- r - 在 R 中更改表格行标签
- javascript - 如何使用 TypeScript 有条件地渲染 LitElement?
- ansible - 如何从列表中获取嵌套值
- jenkins - Jenkins Pipeline 失败的 WorkflowScript:37:期待 '}'
- reactjs - AWS S3 存储放置方法
- reactjs - 用户在 typeahead 输入框中输入很长的数字,onSearch 无法使用 react-bootstrap-typeahead 版本 5.2.1 获取完整的数字
- sql - 为什么添加 GROUP BY 会导致看似无关的错误?
- amazon-web-services - Amazon QuickSight - 显示编号
- python - os.walk 返回一个空列表,然后返回我的实际列表