【问题标题】:How to wait for camera to initialize?如何等待相机初始化?
【发布时间】:2020-11-01 00:25:35
【问题描述】:

我不断收到来自 camera.dart 的错误消息,即“名称”正在被空对象调用。

一段时间后,我意识到问题在于在我的 initstate 中的异步代码完成之前调用了 build 方法(实际上我有点自豪,因为我至少理解了这个问题 :))

我尝试了许多不同的方法来正确初始化我的相机,但我做不到。 这是我的代码的最后一次迭代。

处理这个未来的惯用方式是什么?

  class _PicturePreviewState extends State<PicturePreview> {
  List<CameraDescription> cameras;
  CameraDescription camera;
  CameraController cameraController;
  Future<void> initializeController;

  Future<void> getCameras() async {
    try {
      cameras = await availableCameras();     
    } catch(e) {print(e);}
    camera = cameras.last;
    print(camera);
  }

  @override
  void initState() {
    super.initState();
    // getCameras();
    availableCameras().then((availableCameras) {
      cameras = availableCameras;
      camera = cameras.first;
      cameraController = CameraController(
      camera,
      ResolutionPreset.low,
    );
    initializeController = cameraController.initialize();
    print(cameraController.value.isInitialized);
    });
    
    // cameraController = CameraController(
    //   camera,
    //   ResolutionPreset.low,
    // );
    // initializeController = cameraController.initialize();
    // print(cameraController.value.isInitialized);
  }

  @override
  void dispose() {
    cameraController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<void>(
        future: initializeController,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            // If the Future is complete, display the preview.
              return CameraPreview(cameraController);
          }
          else {
            // Otherwise, display a loading indicator.
            print(snapshot.connectionState);
            return Center(child: CircularProgressIndicator());
          }
        },
      ),

我一直依靠this page 来使用相机包,但我无法逐字使用它,因为我无法继续将相机对象向下传递到我的小部件树。

【问题讨论】:

    标签: flutter async-await camera


    【解决方案1】:

    我修好了。 我将相机对象的初始化放在了小部件的父级中。

    class _TakeReceiptPictureState extends State<TakeReceiptPicture> {
      List<CameraDescription> cameras;
      CameraDescription camera;
    
      @override
      void initState() { 
        super.initState();
        availableCameras().then((availableCameras) {
          cameras = availableCameras;
          camera = cameras.first;
        });       
      }
    

    然后让拍照的小部件有一个CameraDescription类型的参数。

    class PicturePreview extends StatefulWidget {
      final CameraDescription camera;
      const PicturePreview(this.camera, {Key key}) : super(key: key);
    
      @override
      _PicturePreviewState createState() => _PicturePreviewState();
    }
    

    然后将在父级中初始化的相机传递给图片小部件

            onTap: () {
              Navigator.of(context).push(
                 PageTransition(
                      type: PageTransitionType.transferRight,
                      child: PicturePreview(camera)),
                );
            }),
    

    当子小部件的构建方法运行时,相机对象已经初始化并准备就绪。

    现在孩子的状态只有两个变量,相机控制器和初始化控制器future。

      CameraController cameraController;
      Future<void> initializeController;
    
      @override
      void initState() {
        super.initState();    
        cameraController = CameraController(
          widget.camera,
          ResolutionPreset.low,
        );
        initializeController = cameraController.initialize();
      }
    

    TLDR:让相机对象的初始化由小部件的父级负责。

    【讨论】:

      猜你喜欢
      • 2017-11-12
      • 2014-12-28
      • 1970-01-01
      • 2016-07-27
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      相关资源
      最近更新 更多