Flutter Camera 插件错误 - 在 null 上调用了 getter 'height'

Sur*_*esh 2 dart flutter

我正在开发相机应用程序。我正在使用以下相机插件 - https://github.com/flutter/plugins/tree/master/packages/camera

这是我的工作代码 -

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';

List<CameraDescription> cameras;

Future<Null> main() async {
  cameras = await availableCameras();
  runApp(new MaterialApp(
    home: new CameraApp(),
  ));

}

class CameraApp extends StatefulWidget {
  @override
  _CameraAppState createState() => new _CameraAppState();
}

class _CameraAppState extends State<CameraApp> {
  CameraController controller;

  @override
  void initState() {
    super.initState();

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

  @override
  void dispose() {
    controller?.dispose();
    super.dispose();
  }


  @override
  Widget build(BuildContext context) {

    // camera widget
    Widget cameraView = new Container(
      child: new Row(children: [
          new Expanded(
            child: new Column(
                children: <Widget>[
                  new AspectRatio(
                    aspectRatio: controller.value.aspectRatio,
                    child: new CameraPreview(controller)
                  )
                ]
            ),
          )
      ])
    );

    return new Scaffold(
      body: new Stack(
        children: <Widget>[
          (!controller.value.initialized) ? new Container() : cameraView,

           // ---On top of Camera view add one mroe widget---

        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

当我构建应用程序时,我收到以下错误...

I/flutter ( 2097): The following NoSuchMethodError was thrown building CameraApp(dirty, state: _CameraAppState#a0666):
I/flutter ( 2097): The getter 'height' was called on null.
I/flutter ( 2097): Receiver: null
I/flutter ( 2097): Tried calling: height
Run Code Online (Sandbox Code Playgroud)

Ric*_*eap 6

即使您在 Stack 的主体中有三元运算符,Widget cameraView无论是否要使用它,您都在创建- 因此无论controller.value.initialized是真还是假,它都会被创建。调整代码,以便仅在需要时才构建 CameraPreview 树,即如果初始化为 true。例如:

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Stack(
        children: <Widget>[
          (!controller.value.initialized) ? new Container() : buildCameraView(),

          // ---On top of Camera view add one mroe widget---
        ],
      ),
    );
  }

  Widget buildCameraView() {
    return new Container(
      child: new Row(
        children: [
          new Expanded(
            child: new Column(
              children: <Widget>[
                new AspectRatio(
                  aspectRatio: controller.value.aspectRatio,
                  child: new CameraPreview(controller),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
Run Code Online (Sandbox Code Playgroud)

正如您在评论中所建议的那样,您也可以将构建树中的三元运算符移到较低的位置,并将 AspectRatio 替换为空的容器。