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();
}