![](/img/trans.png)
[英]How do I solve this error: LateInitializationError: Field 'weatherInfo' has not been initialized?
[英]How do I solve the LateInitializationError in Flutter?
大家好,我遇到了以下问题,希望有人能帮助我:我正在尝试使用以下代码将相机包含在我的 flutter 应用程序中:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
class Route02 extends StatefulWidget {
@override
CameraState createState() => CameraState();
}
class CameraState extends State<Route02> {
late List<CameraDescription> cameras;
late CameraController _controller;
bool isReady = false;
@override
void initState() {
super.initState();
setupCameras();
}
Future<void> setupCameras() async {
try {
cameras = await availableCameras();
_controller = new CameraController(cameras[0], ResolutionPreset.ultraHigh);
await _controller.initialize();
} on CameraException catch () {
setState(() {
isReady = false;
});
}
setState(() {
isReady = true;
});
}
Widget build(BuildContext context) {
if (!isReady && !_controller.value.isInitialized) {
return Container();
}
return AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: CameraPreview(_controller));
}
}
在应用程序中访问相机部分时,可以看到以下错误,之后相机仍会启动:
LateInitializationError:字段“控制器”尚未初始化。
我已经尝试添加whenComplete()方法并使用? 但它也没有用。
有人有想法吗?
我认为问题在于您正在运行“setupCameras()”,它在“initState()”方法中是异步的,而这不是。 尝试这个:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:camera/camera.dart';
class Route02 extends StatefulWidget {
@override
CameraState createState() => CameraState();
}
class CameraState extends State<Route02> {
late List<CameraDescription> cameras;
late CameraController _controller;
Future<void> setupCameras() async {
try {
cameras = await availableCameras();
_controller = new CameraController(cameras[0], ResolutionPreset.ultraHigh);
await controller.initialize();
}
Widget build(BuildContext context) {
return FutureBuilder(
future: setupCameras(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
return AspectRatio(
aspectRatio: _controller.value.aspectRatio,
child: CameraPreview(_controller)
);
};
);
}
}
我有同样的问题,我找不到完美的解决方案。
我认为 FutureBuilder 在这种情况下不起作用。 您还需要处理处置。 这似乎不是您使用 FutureBuilder 可以做的事情。
实际情况是,您可能无法成功初始化 CameraController。 无论出于何种原因,getCameras 都不会返回任何东西。 这意味着您的 CameraController 始终有可能是 null。因此,尝试调整代码以强制其成为非 null 类型是不正确的。
我最终只是将其更改为可空类型,并在必要时进行 null 检查。 IMO,dart 为了 null 的安全而走得很远。 它只会让事情变得更复杂。 我喜欢 Python 使用 None 处理可为空的方式。
CameraController? _controller;
我看到两个问题:
setupCameras()
会:
try { //... } on CameraException catch () { setState(() { isReady = false; }); } setState(() { isReady = true; });
这意味着如果抛出CameraException
, isReady
将设置为false
,然后立即设置为true
。
build
function 执行以下操作:
if (.isReady &&._controller;value.isInitialized) { return Container(); }
如果isReady
为假(我假设这应该表明_controller
尚未初始化),那么即使_controller
尚未初始化,您也会另外检查_controller.value.isInitialized
。 你可能想要||
而是&&
。
或者,考虑只使_controller
可以为空而不是late
。 如果您需要在访问_controller
之前检查 boolean 标志( isReady
),这并不比使_controller
为空并直接检查_controller != null
,这更简单,更不容易出错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.