首页 文章

颤动摄像头插件

提问于
浏览
3

我试图使用Camera Plugin了解事情是如何运作的 . 我找到的所有例子都有这个部分:

List<CameraDescription> cameras;

Future<Null> main() async {
  cameras = await availableCameras();
  runApp(new CameraApp());
}

有没有办法在 initState() 方法中做到这一点?我想这也是关于运行 initState -method之前所需的异步工作的更一般的问题 . (因为 initState -method不能异步) .

我的目标是创建一个包含来自摄像头的源的 StatefulWidget ,该源从另一个文件中使用 . 这是我到目前为止所拥有的 . 任何帮助赞赏!

List<CameraDescription> cameras;

  @override
  void initState() {
    super.initState();
    getCameras();
    controller = new CameraController(cameras[0], ResolutionPreset.medium);
    controller.initialize().then( (_) {
      if (!mounted) {
        return;
      }
      setState(() {});
    });
  }

  Future<Null> getCameras() async {
    cameras = await availableCameras();
  }

1 回答

  • 5

    您无法在 initState 中执行 async ,但您可以启动其他功能中完成的异步工作,然后在完成 setState 调用后发出信号 . 使用 await ,您可以确保以正确的顺序设置摄像机和控制器 . 最后调用setState将确保在最后重建窗口小部件,您可以在任何地方传递初始化的摄像头控制器 .

    class _CameraState extends State<CameraWidget> {
      List<CameraDescription> cameras;
      CameraController controller;
      bool _isReady = false;
    
      @override
      void initState() {
        super.initState();
        _setupCameras();
      }
    
      Future<void> _setupCameras() async {
        try {
          // initialize cameras.
          cameras = await availableCameras();
          // initialize camera controllers.
          controller = new CameraController(cameras[0], ResolutionPreset.medium);
          await controller.initialize();
        } on CameraException catch (_) {
          // do something on error.
        }
        if (!isMounted) return;
        setState(() {
          _isReady = true;
        });
      }
    
      Widget build(BuildContext context) {
        if (!_isReady) return new Container();
        return ...
      }
    }
    

    您还希望确保处理任何错误,该程序包包含 CameraException ,当特定于平台的代码失败时会抛出该错误 .

相关问题