如何解决 Flutter 中的 LateInitializationError?
Posted
技术标签:
【中文标题】如何解决 Flutter 中的 LateInitializationError?【英文标题】:How do I solve the LateInitializationError in Flutter? 【发布时间】:2021-08-25 13:01:53 【问题描述】:大家好,我遇到以下问题,希望有人可以帮助我: 我正在尝试使用以下代码将相机包含在我的颤振应用程序中:
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() 方法并使用了 ? 但它也不起作用。
有人有想法吗?
【问题讨论】:
controller
在哪里声明? controller
和 _controller
之间有没有你没有提供的关系?
@jamesdlin 是一样的,只是我的错误,我已经修复了,但它仍然是同样的错误。
你解决了这个问题吗?
【参考方案1】:
我认为问题在于您正在运行“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)
);
;
);
【讨论】:
谢谢,我试过了,还是一样的错误。我不知道为什么......【参考方案2】:我遇到了同样的问题,我找不到完美的解决方案。
我认为 FutureBuilder 在这种情况下不会起作用。您还需要处理处置。这似乎不是您使用 FutureBuilder 可以做到的。
现实情况是,您可能无法成功初始化 CameraController。无论出于何种原因,getCameras 都不会返回任何东西。这意味着您的 CameraController 始终有可能为空。因此,试图调整代码以强制它为非 null 类型是不对的。
我最终只是将其更改为可空类型,并在必要时进行空检查。国际海事组织,飞镖会为了零安全而走得很远。它只会让事情变得更复杂。我喜欢 Python 使用 None 处理可为空的方式。
CameraController? _controller;
【讨论】:
【参考方案3】:我看到两个问题:
setupCameras()
会:
try // ... on CameraException catch () setState(() isReady = false; ); setState(() isReady = true; );
这意味着如果CameraException
被抛出,isReady
将被设置为false
,但随后立即被设置为true
。
build
函数可以:
if (!isReady && !_controller.value.isInitialized) return Container();
如果isReady
为假(我假设应该 表明_controller
尚未初始化),那么即使_controller
尚未初始化,您也要额外检查_controller.value.isInitialized
.你可能想要||
而不是&&
。
或者,考虑只使_controller
可以为空,而不是late
。如果你需要在访问_controller
之前检查一个布尔标志(isReady
),这并不比让_controller
为空并直接检查_controller != null
更好,这样更直接,更不容易出错。
【讨论】:
以上是关于如何解决 Flutter 中的 LateInitializationError?的主要内容,如果未能解决你的问题,请参考以下文章
错误:找不到成员:'packageRoot',如何解决忽略:Flutter 中的 deprecated_member_use?