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
相关产品推荐
相关产品推荐

