首页 > 解决方案 > 无法在颤动中从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)。任何帮助都会很棒,谢谢!

标签: flutterdartflutter-dependencies

解决方案


最近我完成了一个教程,它使用相机并且工作正常。下面的代码可以帮助你:

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 卡。


推荐阅读