Flutter — 根据不同的屏幕尺寸有效缩放 UI

这篇文章是关于什么的?

由于我们可以完全控制所有像素,我们可能想要画一个像这样的矩形。

Container(
 height: 40,
 width: 60,
),
复制代码

太棒了!我们有一个矩形,但现在,看看如果我们在iPhone 5s(4英寸显示屏)和iPhone XS Max(6.46英寸显示屏)上显示它会发生什么。

从上面的图片中你可能注意到了,iPhone Xs Max上显示的矩形比iPhone 5s上显示的矩形要小得多。

这是因为 Flutter 不会质疑应用程序是否在 iPhone 5s、iPhone Xs Max 甚至 13 英寸 iPad 上运行,容器将始终为 40 x 60。

我明白了,但我该如何解决?

让我们先用视觉的方式来解决问题,然后,一旦清楚了,我们就会进入到代码中。

让我们取一个空视图,然后向它添加一个网格。

现在,我们将把网格的单元称为“

最后,我们使用块设置矩形的高度和宽度。这将允许我们在每一个显示尺寸上都拥有一致的 UI,从 iPhone 5s 到 iPad,因为对于它们来说,我们都将拥有一个 100 x 100 的网格。

让我们来看看代码实现吧!

开始创建一个名为“size_config.dart”的新 dart 文件,在其中定义 SizeConfig 类。

import ‘package:flutter/widgets.dart’;
 
class SizeConfig {}
复制代码

我们需要导入“widgets.dart”,以便使用Flutter中一个非常方便的类,它被称为** MediaQueryData**,它持有当前媒体的信息,其中有我们屏幕的大小。

现在让我们定义我们将在这个类中使用的属性。

import ‘package:flutter/widgets.dart’;class SizeConfig {
  static MediaQueryData _mediaQueryData;
  static double screenWidth;
  static double screenHeight;
  static double blockSizeHorizontal;
  static double blockSizeVertical;
}
复制代码

我们需要通过编写构造函数来初始化这些值。

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,
      ),
   );
}
复制代码

最后,我们基本上是说矩形的宽度应该是屏幕的 50%,高度是屏幕的 20%。

而这几乎就是全部!这是在iPhone 5s和iPhone XS Max上显示的矩形。

扩展这个概念

如果你是一个更有经验的 Flutter 开发者,你可能已经处理过刘海、状态栏、导航栏和所有这些东西。

Flutter中有一个非常方便的小部件可以有效地处理这些小部件,它被称为“SafeArea”。

我们如何在网格中考虑 SafeArea?

我们首先在 “SizeConfig” 类中添加两个字段,以计算 SafeArea 所占用的空间,并将其从网格中删除。

class SizeConfig {
   static MediaQueryData _mediaQueryData;
   static double screenWidth;
   static double screenHeight;
   static double blockSizeHorizontal;
   static double blockSizeVertical;
   
   static double _safeAreaHorizontal;
   static double _safeAreaVertical;
   static double safeBlockHorizontal;
   static double safeBlockVertical;
   
   void init(BuildContext context) {
     _mediaQueryData = MediaQuery.of(context);
     screenWidth = _mediaQueryData.size.width;
     screenHeight = _mediaQueryData.size.height;
     blockSizeHorizontal = screenWidth / 100;
     blockSizeVertical = screenHeight / 100;
     
     _safeAreaHorizontal = _mediaQueryData.padding.left + 
     _mediaQueryData.padding.right;
     _safeAreaVertical = _mediaQueryData.padding.top +
     _mediaQueryData.padding.bottom;
     safeBlockHorizontal = (screenWidth -
     _safeAreaHorizontal) / 100;
     safeBlockVertical = (screenHeight -
     _safeAreaVertical) / 100;
   }
}
复制代码

这将允许您有效地扩展 UI 而无需担心 SafeArea。

缩放文本呢?

原来你可以使用这个相同的网格来缩放文本,我通常使用 SizeConfig.safeBlockHorizontal 来缩放它,但你也可以使用垂直网格来缩放它。

这是它的样子。 

本文中显示的代码的 GitHub 链接

我在本文中添加的所有代码以及如何使用它的示例都可以在:github.com/rohanjariwa…


原文:medium.com/@rohanjariw…

作者:Rohan Jariwala

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter的跨平台框架让我们可以通过使用相同的代码库开发多个平台的应用程序,包括移动端、Web和桌面应用程序。Flutter Desktop UI是指使用Flutter来构建桌面用户界面的能力。 使用Flutter构建桌面应用程序有几个关键优势。首先,它提供了丰富的UI组件和材料设计风格的样式。这使得开发者可以轻松地创建具有吸引力和一致性的用户界面。不论是在移动设备上还是在桌面上,用户可以享受到相似的应用程序体验。 其次,FlutterUI是响应式的,可以根据不同屏幕大小和设备分辨率自动调整和适应。这使得开发者能够在不同平台上创建适配的用户界面,无需手动调整布局和设计。 另外,Flutter的桌面支持还提供了易于使用的平台接口,使开发者可以访问底层平台功能和API。无论是文件系统访问、网络请求还是系统通知,开发者都可以通过Flutter桌面UI来实现。 最后,使用Flutter构建桌面UI还可以实现代码的重用。开发者可以重用之前构建的移动应用程序中的业务逻辑和UI组件,从而节省开发时间和资源。这为跨平台开发提供了更大的便利和效率。 总的来说,Flutter的桌面UI为开发者提供了广泛且灵活的工具和能力,使他们能够轻松地构建适配不同平台的桌面应用程序,并实现代码的重用和高效开发。这使得开发者能够更快速地将应用程序扩展到不同的设备和操作系统,提供统一和一致的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值