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

Flutter Camera Preview无法随手机横竖屏旋转问题求助

解决Flutter Camera Plugin横屏预览不旋转的问题

嘿,我之前折腾Camera Plugin的时候也踩过这个横屏预览的坑——照片方向正常但预览死活不转,还没法充满屏幕,试过Transform.rotate确实容易出黑边或者拉伸的问题,给你几个亲测有效的解决办法:

1. 监听设备方向,动态调整相机预览配置

首先要让相机感知设备的旋转状态,你可以在页面的State类里混入WidgetsBindingObserver,监听方向变化后更新相机的预览方向和尺寸:

class _CameraScreenState extends State<CameraScreen> with WidgetsBindingObserver {
  late CameraController _controller;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    // 初始化相机,记得设置初始方向
    _initCamera();
  }

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

  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
    // 设备方向变化时,更新相机预览配置
    _updateCameraOrientation();
  }

  Future<void> _updateCameraOrientation() async {
    final orientation = MediaQuery.of(context).orientation;
    // 根据设备方向设置相机的预览方向
    final desiredOrientation = orientation == Orientation.landscape
        ? DeviceOrientation.landscapeLeft
        : DeviceOrientation.portraitUp;
    await _controller.setPreferredOrientation(desiredOrientation);
    if (mounted) setState(() {});
  }
}

2. 基于预览尺寸和屏幕方向适配AspectRatio

不要直接用Transform.rotate硬转,而是利用相机的previewSize和当前屏幕方向来计算正确的宽高比,让CameraPreview自然适配屏幕:

Widget _buildCameraPreview() {
  if (!_controller.value.isInitialized) {
    return const Center(child: CircularProgressIndicator());
  }
  final previewSize = _controller.value.previewSize!;
  final orientation = MediaQuery.of(context).orientation;
  // 横屏时交换宽高比,保证预览充满屏幕
  final aspectRatio = orientation == Orientation.landscape
      ? previewSize.height / previewSize.width
      : previewSize.width / previewSize.height;

  return AspectRatio(
    aspectRatio: aspectRatio,
    child: CameraPreview(_controller),
  );
}

3. 额外注意:相机初始化时的方向设置

在初始化相机控制器的时候,记得指定preferredCameraOrientation,避免初始状态就出现方向偏差:

Future<void> _initCamera() async {
  final cameras = await availableCameras();
  final selectedCamera = cameras.first;
  _controller = CameraController(
    selectedCamera,
    ResolutionPreset.high,
    preferredCameraOrientation: DeviceOrientation.portraitUp, // 初始方向
  );
  await _controller.initialize();
  if (mounted) setState(() {});
}

这样调整后,横屏时预览应该就能自动旋转并充满屏幕了。核心是让相机本身适配设备方向,再通过AspectRatio保证预览画面和屏幕尺寸匹配,而不是强行旋转组件导致适配问题。

内容的提问来源于stack exchange,提问作者Matt Goodis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:51:52