You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用camera插件时,SystemChrome.setPreferredOrientations无法锁定iPhone 12的相机预览方向

Flutter使用camera插件时,SystemChrome.setPreferredOrientations无法锁定iPhone 12的相机预览方向

嘿,这个问题我在iPhone 12上实打实踩过坑!SystemChrome的全局方向锁其实管不到相机插件的预览层——因为相机预览是直接和iOS原生的AVCaptureSession绑定的,Flutter的全局设置对它的优先级不够,所以才会出现App界面不动但预览自己转的情况。给你几个亲测有效的解决思路:

  • 初始化相机时直接焊死预览方向
    这是最核心的一步,在创建CameraController的时候,直接把previewOrientation参数固定为竖屏方向,从根上限制预览的旋转逻辑。代码示例:

    final cameraDescription = await availableCameras().then((cameras) => cameras[0]); // 按需选前置/后置相机
    final controller = CameraController(
      cameraDescription,
      ResolutionPreset.medium,
      enableAudio: false,
      previewOrientation: DeviceOrientation.portraitUp, // 关键:强制预览为竖屏
    );
    await controller.initialize();
    

    注意选分辨率的时候尽量用竖屏适配的预设(比如medium或high),别选那些默认横屏的高分辨率,避免预览拉伸。

  • 加个方向监听器,实时把预览拽回竖屏
    要是偶尔还出现预览偷偷旋转的情况,就给页面加个方向变化监听器,每次设备方向变动时,强制把相机预览的方向重置为竖屏:

    @override
    void initState() {
      super.initState();
      // 注册方向变化监听器
      WidgetsBinding.instance.addObserver(this);
    }
    
    @override
    void dispose() {
      // 记得销毁监听器
      WidgetsBinding.instance.removeObserver(this);
      super.dispose();
    }
    
    @override
    void didChangeMetrics() {
      super.didChangeMetrics();
      // 每次方向变动,强制重置预览方向
      if (controller != null && controller.value.isInitialized) {
        controller.setPreviewOrientation(DeviceOrientation.portraitUp);
      }
    }
    
  • 给iOS原生配置加个保险
    最后再补一步:打开iOS项目里的ios/Runner/Info.plist,把支持的设备方向只保留竖屏选项,避免原生层的配置和Flutter的设置冲突。修改后的配置大概是这样:

    <key>UISupportedInterfaceOrientations</key>
    <array>
      <string>UIInterfaceOrientationPortrait</string>
      <string>UIInterfaceOrientationPortraitUpsideDown</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
      <string>UIInterfaceOrientationPortrait</string>
      <string>UIInterfaceOrientationPortraitUpsideDown</string>
    </array>
    

我当时是结合了第一个和第三个办法解决的,要是你用的是比较旧的camera插件版本(比如0.10.x及以下),建议先升级到最新的稳定版,新版本修复了不少iOS机型上的方向适配bug,能省不少麻烦。

备注:内容来源于stack exchange,提问作者minato

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:33:10