如何解决 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 .你可能想要|| 而不是&amp;&amp;

或者,考虑只使_controller 可以为空,而不是late。如果你需要在访问_controller之前检查一个布尔标志(isReady),这并不比让_controller为空并直接检查_controller != null更好,这样更直接,更不容易出错。

【讨论】:

以上是关于如何解决 Flutter 中的 LateInitializationError?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决flutter中的iOS部署目标问题

如何解决flutter中的权限处理程序错误?

如何解决flutter中的性能和热重载问题?

如何解决flutter中的http错误代码400缺少参数?

错误:找不到成员:'packageRoot',如何解决忽略:Flutter 中的 deprecated_member_use?

如何解决mac上flutter中的“error running pod install”?