Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 颤振相机插件错误-getter';高度';被调用为空_Dart_Flutter - Fatal编程技术网

Dart 颤振相机插件错误-getter';高度';被调用为空

Dart 颤振相机插件错误-getter';高度';被调用为空,dart,flutter,Dart,Flutter,我正在开发一个摄像头应用程序。我正在使用以下摄像头插件- 这是我的工作代码- import 'dart:async'; import 'package:flutter/material.dart'; import 'package:camera/camera.dart'; List<CameraDescription> cameras; Future<Null> main() async { cameras = await availableCameras();

我正在开发一个摄像头应用程序。我正在使用以下摄像头插件-

这是我的工作代码-

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---

        ],
      ),
    );
  }
}

即使在堆栈体中有三元运算符,也要创建
小部件cameraView
,不管是否要使用它-因此无论
controller.value.initialized
是真还是假,都要创建它。调整代码,使CameraPreview树仅在需要时生成,即如果initialized为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),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
@覆盖
小部件构建(构建上下文){
归还新脚手架(
正文:新堆栈(
儿童:[
(!controller.value.initialized)?新容器():buildCameraView(),
//---在相机视图顶部添加一个mroe小部件---
],
),
);
}
Widget buildCameraView(){
退回新货柜(
孩子:新的一排(
儿童:[
新扩展(
子:新列(
儿童:[
新方面(
aspectRatio:controller.value.aspectRatio,
子项:新CameraPreview(控制器),
),
],
),
),
],
),
);
}

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

即使在使用此检查
(!controller.value.initialized)之后也是如此?new Container():cameraView
,仍然会收到错误消息,即“getter'height'在null上被调用”, 错误消息仅在应用程序上弹出几秒钟,则表示您正在
didChangeDependencies()
中初始化相机控制器。如果是,则使用此技术

bool cameraInitialized = false;
@覆盖
void didChangeDependencies(){
如果(CameraInInitialized==false){
最终屏幕参数=
ModalRoute.of(context.settings.arguments);
int cameraIndex=Provider.of(上下文)
.XX
.firstWhere((element)=>element.id==arguments.XX`在此处输入代码`id)
.cameraIndex;
控制器=新的CameraController(
widget.cameras[cameraIndex],ResolutionPreset.medium);
controller.initialize()。然后((值){
如果(!已安装){
返回;
}
setState((){});
});
设置状态(){
CameraInInitialized=true;
});
}
super.didChangeDependencies();
}

此行
(!controller.value.initialized)?新容器():cameraView,
不会做同样的事情吗?请参阅编辑后的答案-正在构建
CameraPreview
,即使不需要它。您好,感谢您的回复并指导我处理
CameraPreview
事情。我用这行代码(!controller.value.initialized)修复了这个问题?new Container():new AspectRatio(AspectRatio:controller.value.AspectRatio,child:new CameraPreview(controller))。但是,为什么您的示例代码与我的示例代码一样,我已经在我的帖子中分享了。事实上,您的
main()
示例代码与我已经发布的代码相同!!!不管怎样,我接受你的帖子作为回答。如果你能在你的帖子中添加我的解决方案,那就太好了。因此,如果将来有人遇到这个问题,其他人可以很容易地得到解决方案。感谢您对main()的评论-删除了多余的MaterialApp。您建议可以在任意位置插入三元运算符,这是正确的;我想让你的代码结构尽可能接近原始的。关键是原始代码在测试控制器是否初始化之前试图构造AspectRatio。
bool cameraInitialized = false;
  @override
  void didChangeDependencies() {
    if (cameraInitialized == false) {
     
      final ScreenArguments arguments =
          ModalRoute.of(context).settings.arguments;

      int cameraIndex = Provider.of<XYZ>(context)
          .XX
          .firstWhere((element) => element.id == arguments.XX`enter code here`Id)
          .cameraIndex;
      controller = new CameraController(
          widget.cameras[cameraIndex], ResolutionPreset.medium);
      controller.initialize().then((value) {
        if (!mounted) {
          return;
        }
        setState(() {});
      });
     

    setState(() {
            cameraInitialized = true;
          });


    }
    super.didChangeDependencies();
  }