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

如何获取Flutter中图片在设备屏幕上Contrast的当前显示尺寸?

解决Flutter中获取图片实际显示尺寸的方法

以下几种方案可直接获取图片在屏幕上的实际渲染尺寸:

方法一:原图尺寸+布局约束计算(适用于等比例缩放场景)

如果图片是按比例适配父容器宽度(比如fit: BoxFit.contain且宽度占满),可先获取原图宽高,再结合实际可用宽度计算缩放后的尺寸:

// 1. 获取原图尺寸
final imageProvider = AssetImage('assets/your_image.png'); // 替换为你的图片源
final imageStream = imageProvider.resolve(ImageConfiguration.empty);
imageStream.addListener(
  ImageStreamListener((ImageInfo info, bool _) {
    final originalWidth = info.image.width.toDouble();
    final originalHeight = info.image.height.toDouble();
    
    // 2. 获取当前可用宽度(示例为屏幕宽度,可根据实际布局调整)
    final availableWidth = MediaQuery.of(context).size.width;
    
    // 3. 计算缩放后的显示尺寸
    final scaleRatio = availableWidth / originalWidth;
    final displayHeight = originalHeight * scaleRatio;
    
    print('实际显示尺寸:${availableWidth.round()} * ${displayHeight.round()}');
  }),
);

方法二:GlobalKey直接读取渲染尺寸(通用场景)

通过GlobalKey绑定Image组件,获取其渲染对象的实际尺寸:

final GlobalKey imageKey = GlobalKey();

// 在build方法中使用带key的Image组件
Image(
  key: imageKey,
  image: AssetImage('assets/your_image.png'),
  fit: BoxFit.contain,
  width: MediaQuery.of(context).size.width,
);

// 布局完成后读取尺寸
WidgetsBinding.instance.addPostFrameCallback((_) {
  final renderBox = imageKey.currentContext?.findRenderObject() as RenderBox?;
  if (renderBox != null) {
    final displaySize = renderBox.size;
    print('实际显示尺寸:${displaySize.width.round()} * ${displaySize.height.round()}');
  }
});

方法三:LayoutBuilder+FutureBuilder实时计算

利用LayoutBuilder获取父容器约束,结合原图尺寸实时计算显示尺寸:

LayoutBuilder(
  builder: (context, constraints) {
    final maxWidth = constraints.maxWidth;
    final imageProvider = AssetImage('assets/your_image.png');
    
    return FutureBuilder<ImageInfo>(
      future: imageProvider.resolve(ImageConfiguration.empty).first,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          final originalWidth = snapshot.data!.image.width.toDouble();
          final originalHeight = snapshot.data!.image.height.toDouble();
          final scaleRatio = maxWidth / originalWidth;
          final displayHeight = originalHeight * scaleRatio;
          
          return Column(
            children: [
              Image(
                image: imageProvider,
                fit: BoxFit.contain,
                width: maxWidth,
              ),
              Text('实际显示尺寸:${maxWidth.round()} * ${displayHeight.round()}'),
            ],
          );
        }
        return CircularProgressIndicator();
      },
    );
  },
);

注意:如果使用BoxFit.cover、BoxFit.fill等非等比例缩放模式,方法一的计算逻辑不适用,此时优先使用方法二直接读取渲染后的实际尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:35:29