dart 如何解决异步函数中的瞬间抖动延迟初始化摄像机误差?

xvw2m8pv  于 2023-01-06  发布在  其他
关注(0)|答案(2)|浏览(119)

我正在开发一个包含拍照功能的网络应用程序。相机可以正常工作,当用户移动到相机页面时会自动加载。唯一的问题是,屏幕 Flink 红色并显示"LateInitializationError:字段"camController"尚未初始化"错误(camController是我的相机控制器)。
下面是我的屏幕代码:

import 'package:camera/camera.dart';
import 'package:flutter/material.dart';

class createView extends StatefulWidget {
  const createView({Key? key}) : super(key: key);

  @override
  State<createView> createState() => _createViewState();
}

class _createViewState extends State<createView> {
  late List<CameraDescription> deviceCameras;
  late CameraController camController;

  @override
  void initState() {
    getCamera();
    super.initState();
  }

  void getCamera() async {
    final deviceCameras = await availableCameras();
    camController = CameraController(deviceCameras.first, ResolutionPreset.high,
        enableAudio: false);
    await camController.initialize().then((value) {
      if (!mounted) {
        return;
      }
      setState(() {});
    }).catchError((e) {
      print(e);
    });
  }

  @override
  void dispose() {
    camController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (camController.value.isInitialized) {
      return Scaffold(
        body: Center(
          child: SingleChildScrollView(
            child: Container(
              padding: const EdgeInsets.all(20),
              decoration: BoxDecoration(
                color: Color.fromARGB(136, 255, 255, 255),
                borderRadius: BorderRadius.all(Radius.circular(20)),
                boxShadow: [
                  BoxShadow(
                      color: Color.fromARGB(37, 0, 0, 0),
                      spreadRadius: 1,
                      blurRadius: 15)
                ],
              ),
              width: 300,
              child: CameraPreview(camController),
            ),
          ),
        ),
      );
    } else {
      return CircularProgressIndicator();
    }
  }
}

和我的错误日志:

The following LateError was thrown building createView$(dirty, state: _createViewState#54a24):
LateInitializationError: Field 'camController' has not been initialized.
The relevant error-causing widget was:
createView$
lib\home.dart:19
When the exception was thrown, this was the stack:
C:/b/s/w/ir/cache/builder/src/out/host_debug/dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 266:49      throw_
packages/podvus/myViews/createView.dart 13:25                                                                                  get camController
packages/podvus/myViews/createView.dart 43:29                                                                                  build
packages/flutter/src/widgets/framework.dart 4992:27   
packages/flutter/src/widgets/framework.dart 4878:15                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 5050:11                                                                            performRebuild
packages/flutter/src/widgets/framework.dart 4604:5                                                                             rebuild
packages/flutter/src/widgets/framework.dart 4859:5                                                                             [_firstBuild]
packages/flutter/src/widgets/framework.dart 5041:11                                                                            [_firstBuild]
packages/flutter/src/widgets/framework.dart 4853:5                                                                             mount
packages/flutter/src/widgets/framework.dart 3863:15                                                                            inflateWidget

等等。
这个错误是在屏幕本身的构建中,因为在build方法中删除对它的引用会删除这个错误。我正在尝试将if(camController. value. isInitialized)更改为其他值以使它工作。

pu82cl6c

pu82cl6c1#

如果涉及任何async初始化,则不建议使用late
返回的deviceCameras也有可能是空的,所以最好的方法是将camControllerdeviceCameras定义为可选的,并在后面的代码中优雅地处理空值。

List<CameraDescription>? deviceCameras;
CameraController? camController;
klsxnrf1

klsxnrf12#

找到答案了--两行代码:使用bool值作为触发器,当摄像头实际初始化时,该值将更新为true。在“if(camController.value.isInitialized)”中使用该值,则应用程序将在摄像头初始化时显示加载指示符,而不是错误。

class _createViewState extends State<createView> {
  late List<CameraDescription> deviceCameras;
  late CameraController camController;
  bool isReady = false;

  @override
  void initState() {
    getCamera();
    super.initState();
  }

  void getCamera() async {
    final deviceCameras = await availableCameras();
    camController = CameraController(deviceCameras.first, ResolutionPreset.high,
        enableAudio: false);
    await camController.initialize().then((value) {
      isready = true;
      if (!mounted) {
        return;
      }
      setState(() {});
    }).catchError((e) {
      print(e);
    });
  }

  @override
  void dispose() {
    camController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    if (isReady) {
      return Scaffold(

相关问题