Flutter相机插件

8

我对Flutter和Dart都是新手,我正在尝试使用相机插件来了解事情的运作方式。我发现的所有示例都有这部分:

List<CameraDescription> cameras;

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

有没有办法在 initState() 方法内完成此操作?我猜这也是关于在运行initState方法之前所需的异步工作的一般性问题。(因为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();
  }

1
请检查此链接 https://medium.com/@navinkumar0118/take-a-picture-using-flutter-camera-a9c11d282632,该链接与Flutter相机有关。 - Navin Kumar
1个回答

16

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

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

您还需要确保处理任何错误,该软件包包括一个CameraException,当平台特定代码失败时抛出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接