我对Flutter和Dart都是陌生的,并且我正在尝试使用Camera Plugin来了解事物的工作原理。我发现的所有示例都包含以下部分:

List<CameraDescription> cameras;

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

有什么办法可以在initState()方法中执行此操作吗?我猜这也是关于在运行initState -method之前需要进行的异步工作的一个更一般的问题。 (因为initState-方法不能异步)。

我的目标是创建一个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();
  }

最佳答案

您不能在async中完成initState的工作,但是可以启动在其他函数中完成的异步工作,然后在完成setState调用后发出信号。使用await,可以确保以正确的顺序设置摄像机和 Controller 。最后调用setState将确保在最后重建小部件,您可以在任何地方传递初始化的相机 Controller 。

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 (!mounted) return;
    setState(() {
      _isReady = true;
    });
  }

  Widget build(BuildContext context) {
    if (!_isReady) return new Container();
    return ...
  }
}

您还需要确保处理任何错误,该程序包包含一个CameraException,当平台特定的代码失败时会抛出该ojit_code。

关于dart - Flutter相机插件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49640723/

10-10 17:55