簡體   English   中英

Flutter中的LateInitializationError如何解決?

[英]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;

我看到兩個問題:

  1. setupCameras()會:

     try { //... } on CameraException catch () { setState(() { isReady = false; }); } setState(() { isReady = true; });

    這意味着如果拋出CameraExceptionisReady將設置為false ,然后立即設置為true

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM