【问题标题】:Flutter LateError on controller has not been initialized控制器上的 Flutter LateError 尚未初始化
【发布时间】:2022-11-03 13:20:37
【问题描述】:

当我尝试调用我的小部件时,它在控制器上显示_controller 未初始化的错误我尝试将其设置为 initstate。

class CameraApp extends StatefulWidget {
  final dynamic loadingWidget;
  CameraApp(this.loadingWidget);

  _CameraAppState createState() => _CameraAppState();
}

class _CameraAppState extends State<CameraApp> with WidgetsBindingObserver {
  late List<CameraDescription> _cameras;
  late CameraController _controller;
  int _selected = 0;

  @override
  void initState() {
    CameraController _controller;
    super.initState();
    setupCamera();
    WidgetsBinding.instance!.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance!.addObserver(this);
    _controller.dispose();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) async {
    if (_controller == null || !_controller.value.isInitialized) {
      return;
    }

    if (state == AppLifecycleState.inactive) {
      _controller.dispose();
    } else if (state == AppLifecycleState.resumed) {
      setupCamera();
    }
  }

  @override
  Widget build(BuildContext context) {
    if (_controller == null) {
      if (widget.loadingWidget != null) {
        return widget.loadingWidget;
      } else {
        return Container(
          color: Colors.black,
        );
      }
    } else {
      return CameraPreview(_controller);
    }
  }

  Future<void> setupCamera() async {
    await [
      Permission.camera,
    ].request();
    _cameras = await availableCameras();
    var controller = await selectCamera();
    setState(() => _controller = controller);
  }

  selectCamera() async {
    var controller =
        CameraController(_cameras[_selected], ResolutionPreset.max);
    await controller.initialize();
    return controller;
  }

  toggleCamera() async {
    int newSelected = (_selected + 1) % _cameras.length;
    _selected = newSelected;

    var controller = await selectCamera();
    setState(() => _controller = controller);
  }
}

我在一些小部件上展示了这款相机,但不知道如何解决这个问题。也许是因为晚了,这导致了一个问题。显示每次加载时我也尝试添加 contoller.initialize();在 initstate 但不工作

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    LateError 表示使用late 关键字声明的变量在您尝试使用它时尚未初始化,作为一般规则,我尽量不要使用late 关键字,除非没有更好的方法来实现我想要的因为它往往会导致难以发现错误。

    所以你有两个late 变量,_controller_cameras

    两者都在setupCamera 方法上进行初始化,该方法是异步的并在initState 上被调用,但我认为问题是initState 在运行build 之前不会等待它们完成初始化,您尝试在其中读取@ 987654330@ 并且,因为你还没有分配它,你会得到一个 LateError。

    如果我的断言是正确的,它应该是一个相对简单的修复:

    从:

    late List<CameraDescription> _cameras;
    late CameraController _controller;
    

    至:

    List<CameraDescription> _cameras = []; // could also be null I guess.
    CameraController _controller = null;
    

    如果_controller 为null,您已经在各处进行了空检查,我相信您应该利用这一点,以便如果build_controller 分配值之前运行,您将获得加载小部件。

    【讨论】:

      【解决方案2】:

      相机控制器 _controller = null;它不能取空值

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 2021-12-02
        • 2022-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2021-08-03
        • 2021-11-17
        相关资源
        最近更新 更多