dart 尝试在Flutter应用程序中显示相机屏幕时,在空值上使用Null检查运算符

u91tlkcl  于 2023-04-27  发布在  Flutter
关注(0)|答案(2)|浏览(131)

场景

我试图在我的Flutter应用程序中启动相机流屏幕,以便使用google_ml_kit_face_detection捕获自拍照。为此,我需要将ResolutionPreset设置为CameraController对象。我正在使用Flutter的camera插件。
我从system_info_plus获取手机的RAM,它返回一个Future〈int?〉
在我的initState()中,我调用函数以获取RAM值,然后调用函数以通过传递基于手机RAM的ResolutionPreset来初始化CameraController对象。

我的密码

CameraController? _controller;
int? deviceMemory;

@override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) async {
      await getDeviceMemory();
      initCameraLens();
      await startLive();
    });
  }

Future<void> getDeviceMemory() async {
    deviceMemory = await SystemInfoPlus.physicalMemory; // returns in MB
  }

void initCameraLens() {
    // relevant code
  }

Future<void> startLive() async {
    final camera = cameras[_cameraIndex];

    // setup camera controller
    _controller = CameraController(
      camera,
      deviceMemory != null
          ? deviceMemory! <= 3072
              ? ResolutionPreset.low
              : ResolutionPreset.high
          : ResolutionPreset.high,
      enableAudio: false,
    );

    // start streaming using camera
    _controller?.initialize().then((_) {
      if (!mounted) {
        return;
      }

      // process camera image to get an instance of input image
      _controller?.startImageStream(_processCameraImage);

      setState(() {});
    });
  }

@override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        fit: StackFit.expand,
        children: [
          _controller != null ?
            CameraPreview(_controller!) :
            Container(
              width: 100.w,
              height: 100.h,
              color: Colors.black,
            ),
         ],
       ),
    ),
  }

面临的问题

当这个屏幕启动时,在短短的一两秒钟内,我得到以下错误:构建CaptureFaceScreen(dirty,state:_CaptureFaceScreenState#38f97):在空值上使用的空检查运算符,在此之后相机开始工作,并且从那时起一切顺利运行。

申请

我想知道是什么导致了我的代码中的这个异常,以及如何解决这个问题。

wydwbb8l

wydwbb8l1#

我认为getDeviceMemory()不够快。所以试着在它旁边添加一个.then,这样它就不会继续,直到getDeviceMemory()完成。

@override
void initState() {
  super.initState();
  getDeviceMemory().then((value) {
    initCameraLens();
    startLive();
  });
}

您不应该需要使用WidgetsBinding.instance.addPostFrameCallback((_)

z9zf31ra

z9zf31ra2#

我通过使用一些静态数据初始化CameraController对象,然后通过initState()调用中的相关函数设置所需的值来管理解决方案。

而不是:

CameraController? _controller;

我正在做:

CameraController _controller = CameraController(
    const CameraDescription(
      name: "",
      lensDirection: CameraLensDirection.front,
      sensorOrientation: 90,
    ),
    ResolutionPreset.high,
    enableAudio: false,
  );

相关问题