如何让 Flutter 小部件适应不同的屏幕尺寸

Posted

技术标签:

【中文标题】如何让 Flutter 小部件适应不同的屏幕尺寸【英文标题】:How to make flutter widgets adaptive to different screen sizes 【发布时间】:2019-07-12 09:00:33 【问题描述】:

我正在使用 Container 的宽度和高度参数来确定小部件的大小。但如果在其他设备上测试,小部件不自适应。我来自原生 android,我曾经使用适应任何屏幕尺寸的密度无关像素(dp)。 flutter 中的 dp 等价于什么? 我不想每次都使用 MediaQuery 来计算屏幕宽度和高度。

【问题讨论】:

一些示例代码会有所帮助,也许您的代码有问题。 好吧,任何示例代码都可以工作。只需使用容器并设置宽度和高度并在不同的屏幕尺寸上进行测试 【参考方案1】:

您可以通过这种方式设置 UI 小部件的大小:

 width: 100.0 * MediaQuery.of(context).devicPixelRatio ,

MediaQuery.of(context).devicPixelRatio 函数将返回每个逻辑像素中的实际像素数,因此您可以确保测试设备上相同的 100.0 像素对于用户来说是典型的,无论他们的屏幕密度如何。

【讨论】:

如果我想将小部件的高度和宽度分别设置为 100 、 50 。我应该如何使用您的解决方案来做到这一点 高度:100.0 * MediaQuery.of(context).devicPixelRatio ,宽度:50.0 * MediaQuery.of(context).devicPixelRatio , 实际上这不是一个非常可靠的解决方案,因为设备每个逻辑像素可能有很多像素,而且空间可能太大。 感谢@OmarBoshra 的反馈!我会检查并返回给你。【参考方案2】:

您可以使用 SizeBox.expand 小部件让您的小部件扩展以占用可用空间,而不管大小documentation

SizedBox.expand(

  child:MyButton(),
),

如果您想保持纵横比不受屏幕尺寸的影响,您可以使用 AspectRatio 小部件documentation

AspectRatio(

 aspectRatio: 3/2,

  child:MyButton(),
),

如果您的小部件只是在一行或一列中,并且您想在它们之间添加权重以填充空间,您可以使用扩展小部件

  Expanded(
            flex: 1,//weight for the widget
            child: Container(
              color: Colors.amber,
              height: 100,
            ),
          )

,

【讨论】:

【参考方案3】:

我是这样申请的:

 class SizeConfig 
          static MediaQueryData _mediaQueryData;
          static double screenWidth;
          static double screenHeight;
          static double blockSizeHorizontal;
          static double blockSizeVertical;

          void init(BuildContext context) 
           _mediaQueryData = MediaQuery.of(context);
           screenWidth = _mediaQueryData.size.width;
           screenHeight = _mediaQueryData.size.height;
           blockSizeHorizontal = screenWidth / 100;
           blockSizeVertical = screenHeight / 100;
          
          

  class HomeScreen extends StatelessWidget   @override  Widget
 build(BuildContext context)   SizeConfig().init(context);  …   
     @override
     Widget build(BuildContext context) 
      return Center(
       child: Container(
        height: SizeConfig.blockSizeVertical * 20,
        width: SizeConfig.blockSizeHorizontal * 50,
        color: Colors.orange,
       ),
      );
     

https://medium.com/flutter-community/flutter-effectively-scale-ui-according-to-different-screen-sizes-2cb7c115ea0a

【讨论】:

以上是关于如何让 Flutter 小部件适应不同的屏幕尺寸的主要内容,如果未能解决你的问题,请参考以下文章

如何让这个flutter屏幕根据不同的屏幕尺寸做出响应?

针对不同屏幕尺寸在特定像素位置绘制小部件

Flutter - 动态小部件定位

如何根据屏幕尺寸调整颤振小部件的大小?

Flutter 小部件显示在所有屏幕上

如何让网站适应不同尺寸的手机屏幕?