颤动摄像头插件

时间:2018-04-03 23:57:33

标签: dart flutter

我是Flutter和Dart的新手,我正在尝试使用Camera Plugin来了解事情是如何运作的。我发现的所有例子都有这个部分:

    Array
    (
        [1] => Array
            (
                [0] => A
            )

        [2] => Array
            (
                [0] => B
                [1] => C
            )

        [3] => Array
            (
                [0] => D
                [1] => E
                [2] => F
                [3] => G
            )

        [4] => Array
            (
                [0] => H
                [1] => I
                [2] => J
                [3] => K
                [4] => L
                [5] => M
                [6] => N
                [7] => O
            )

    )

我有什么方法可以在List<CameraDescription> cameras; Future<Null> main() async { cameras = await availableCameras(); runApp(new CameraApp()); } 方法中执行此操作吗?我想这也是关于运行initState() - 方法之前所需的异步工作的更普遍的问题。 (因为initState - 方法不能是异步的。)

我的目标是创建一个initState,其中包含来自相机的供稿,该供稿来自其他文件。这是我到目前为止所拥有的。任何帮助表示赞赏!

StatefulWidget

1 个答案:

答案 0 :(得分:5)

您无法在asyncinitState工作,但您可以启动其他功能中完成的异步工作,然后在完成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,当特定于平台的代码失败时会引发该错误。