《Flutter入门疑难杂症》 Flutter的UI适配方案

2023-10-26

本文后面已经被我用新的extension大法替代咯 ,有兴趣的可以看我写的这篇文章.
https://blog.csdn.net/WZAHD/article/details/111404843?spm=1001.2014.3001.5501

话不多说先上代码:

import 'package:flutter/material.dart';
import 'dart:ui' as ui show window;

/**
 * @Author: thl
 * @GitHub: https://github.com/Sky24n
 * @Email: 863764940@qq.com
 * @Email: sky24no@gmail.com
 * @Description: Screen Util.
 * @Date: 2018/9/8
 */

///默认设计稿尺寸(单位 dp or pt)
double _designW = 375.0;
double _designH = 812.0;
double _designD = 2.0;

/**
 * 配置设计稿尺寸(单位 dp or pt)
 * w 宽
 * h 高
 * density 像素密度
 */

/// 配置设计稿尺寸 屏幕 宽,高,密度。
/// Configuration design draft size  screen width, height, density.
void setDesignWHD(double w, double h, {double density = 3.0}) {
  _designW = w ?? _designW;
  _designH = h ?? _designH;
  _designD = density ?? _designD;
}

/// Screen Util.
class ScreenUtil {
  double _screenWidth = 0.0;
  double _screenHeight = 0.0;
  double _screenDensity = 0.0;
  double _statusBarHeight = 0.0;
  double _bottomBarHeight = 0.0;
  double _appBarHeight = 0.0;
  MediaQueryData _mediaQueryData;

  static final ScreenUtil _singleton = ScreenUtil();

  static ScreenUtil getInstance() {
    _singleton._init();
    return _singleton;
  }

  _init() {
    MediaQueryData mediaQuery = MediaQueryData.fromWindow(ui.window);
    if (_mediaQueryData != mediaQuery) {
      _mediaQueryData = mediaQuery;
      _screenWidth = mediaQuery.size.width;
      _screenHeight = mediaQuery.size.height;
      _screenDensity = mediaQuery.devicePixelRatio;
      _statusBarHeight = mediaQuery.padding.top;
      _bottomBarHeight = mediaQuery.padding.bottom;
      _appBarHeight = kToolbarHeight;
    }
  }

  /// screen width
  /// 屏幕 宽
  double get screenWidth => _screenWidth;

  /// screen height
  /// 屏幕 高
  double get screenHeight => _screenHeight;

  /// appBar height
  /// appBar 高
  double get appBarHeight => _appBarHeight;

  /// screen density
  /// 屏幕 像素密度
  double get screenDensity => _screenDensity;

  /// status bar Height
  /// 状态栏高度
  double get statusBarHeight => _statusBarHeight;

  /// bottom bar Height
  double get bottomBarHeight => _bottomBarHeight;

  /// media Query Data
  MediaQueryData get mediaQueryData => _mediaQueryData;

  /// screen width
  /// 当前屏幕 宽
  static double getScreenW(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery.size.width;
  }

  /// screen height
  /// 当前屏幕 高
  static double getScreenH(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery.size.height;
  }

  /// screen density
  /// 当前屏幕 像素密度
  static double getScreenDensity(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery.devicePixelRatio;
  }

  /// status bar Height
  /// 当前状态栏高度
  static double getStatusBarH(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery.padding.top;
  }

  /// status bar Height
  /// 当前BottomBar高度
  static double getBottomBarH(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery.padding.bottom;
  }

  /// 当前MediaQueryData
  static MediaQueryData getMediaQueryData(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery;
  }

  /// 仅支持纵屏。
  /// returns the size after adaptation according to the screen width.(unit dp or pt)
  /// 返回根据屏幕宽适配后尺寸(单位 dp or pt)
  /// size 单位 dp or pt
  static double getScaleW(BuildContext context, double size) {
    if (context == null || getScreenW(context) == 0.0) return size;
    return size * getScreenW(context) / _designW;
  }

  /// 仅支持纵屏。
  /// returns the size after adaptation according to the screen height.(unit dp or pt)
  /// 返回根据屏幕高适配后尺寸 (单位 dp or pt)
  /// size unit dp or pt
  static double getScaleH(BuildContext context, double size) {
    if (context == null || getScreenH(context) == 0.0) return size;
    return size * getScreenH(context) / _designH;
  }

  /// 仅支持纵屏。
  /// returns the font size after adaptation according to the screen density.
  /// 返回根据屏幕宽适配后字体尺寸
  /// fontSize 字体尺寸
  static double getScaleSp(BuildContext context, double fontSize) {
    if (context == null || getScreenW(context) == 0.0) return fontSize;
    return fontSize * getScreenW(context) / _designW;
  }

  /// Orientation
  /// 设备方向(portrait, landscape)
  static Orientation getOrientation(BuildContext context) {
    MediaQueryData mediaQuery = MediaQuery.of(context);
    return mediaQuery.orientation;
  }

  /// 仅支持纵屏。
  /// returns the size after adaptation according to the screen width.(unit dp or pt)
  /// 返回根据屏幕宽适配后尺寸(单位 dp or pt)
  /// size 单位 dp or pt
  double getWidth(double size) {
    return _screenWidth == 0.0 ? size : (size * _screenWidth / _designW);
  }

  /// 仅支持纵屏。
  /// returns the size after adaptation according to the screen height.(unit dp or pt)
  /// 返回根据屏幕高适配后尺寸(单位 dp or pt)
  /// size unit dp or pt
  double getHeight(double size) {
    return _screenHeight == 0.0 ? size : (size * _screenHeight / _designH);
  }

  /// 仅支持纵屏
  /// returns the size after adaptation according to the screen width.(unit dp or pt)
  /// 返回根据屏幕宽适配后尺寸(单位 dp or pt)
  /// sizePx unit px
  double getWidthPx(double sizePx) {
    return _screenWidth == 0.0
        ? (sizePx / _designD)
        : (sizePx * _screenWidth / (_designW * _designD));
  }

  /// 仅支持纵屏。
  /// returns the size after adaptation according to the screen height.(unit dp or pt)
  /// 返回根据屏幕高适配后尺寸(单位 dp or pt)
  /// sizePx unit px
  double getHeightPx(double sizePx) {
    return _screenHeight == 0.0
        ? (sizePx / _designD)
        : (sizePx * _screenHeight / (_designH * _designD));
  }

  /// 仅支持纵屏。
  /// returns the font size after adaptation according to the screen density.
  /// 返回根据屏幕宽适配后字体尺寸
  /// fontSize 字体尺寸
  double getSp(double fontSize) {
    if (_screenDensity == 0.0) return fontSize;
    return fontSize * _screenWidth / _designW;
  }

  /// 兼容横/纵屏。
  /// 获取适配后的尺寸,兼容横/纵屏切换,可用于宽,高,字体尺寸适配。
  /// Get the appropriate size, compatible with horizontal/vertical screen switching, can be used for wide, high, font size adaptation.
  double getAdapterSize(double dp) {
    if (_screenWidth == 0 || _screenHeight == 0) return dp;
    return getRatio() * dp;
  }

  /// 适配比率。
  /// Ratio.
  double getRatio() {
    return (_screenWidth > _screenHeight ? _screenHeight : _screenWidth) /
        _designW;
  }

  /// 兼容横/纵屏。
  /// 获取适配后的尺寸,兼容横/纵屏切换,适应宽,高,字体尺寸。
  /// Get the appropriate size, compatible with horizontal/vertical screen switching, can be used for wide, high, font size adaptation.
  static double getAdapterSizeCtx(BuildContext context, double dp) {
    Size size = MediaQuery.of(context).size;
    if (size == Size.zero) return dp;
    return getRatioCtx(context) * dp;
  }

  /// 适配比率。
  /// Ratio.
  static double getRatioCtx(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return (size.width > size.height ? size.height : size.width) / _designW;
  }
}

在这里设置全局设置UI设计稿的尺寸:

///默认设计稿尺寸(单位 dp or pt)
double _designW = 375.0;
double _designH = 812.0;
double _designD = 2.0;

然后,配置自己的常用UI属性:

class UIDesign {
  ///************************字体*************************
  static double font_12 = ScreenUtil.getInstance().getSp(12);
  static double font_14 = ScreenUtil.getInstance().getSp(14);
  static double font_16 = ScreenUtil.getInstance().getSp(16);
  static double font_17 = ScreenUtil.getInstance().getSp(17);
  static double font_18 = ScreenUtil.getInstance().getSp(18);

  ///************************颜色*************************

  static Color cl_33 = Color(0xFF333333); //51
  static Color cl_66 = Color(0xFF666666); //102
  static Color cl_99 = Color(0xFF999999); //153
  static Color cl_C9 = Color(0xFFC9C9C9); //153
  static Color cl_db = Color(0xFFDBDBDB); //153
  static Color cl_white = Color(0xFFFFFFFF); //153
  static Color cl_D0 = Color(0xFFD0D0D0); //51

  static Color cl_6F3A10 = Color(0xFF6F3A10); //153
  static Color cl_9C6D24 = Color(0xFF9C6D24); //153
  static Color cl_CE9754 = Color(0xFFCE9754); //153
  static Color cl_D1B581 = Color(0xFFD1B581); //153

  static Color cl_FFFCF9 = Color(0xFFFFFCF9); //153
  static Color cl_EE4D4A = Color(0xFFEE4D4A); //153
  static Color cl_FF442A = Color(0xFFFF442A); //153
  static Color cl_008AFF = Color(0xFF008AFF); //153


  ///************************间距*************************

  static double dp1 = ScreenUtil.getInstance().getWidth(1);
  static double dp2 = ScreenUtil.getInstance().getWidth(2);
  static double dp3 = ScreenUtil.getInstance().getWidth(3);
  static double dp4 = ScreenUtil.getInstance().getWidth(4);
  static double dp5 = ScreenUtil.getInstance().getWidth(5);
  static double dp6 = ScreenUtil.getInstance().getWidth(6);

  ///************************文字风格*************************
  static TextStyle txStyle14_33 = TextStyle(
    fontSize: font_14,
    color: cl_33,
  );
  static TextStyle txStyle14_DBDBDB = TextStyle(
    fontSize: font_14,
    color: cl_db,
  );
  static TextStyle txStyle16_33 = TextStyle(
    fontSize: font_16,
    color: cl_33,
  );

  static TextStyle txStyle12_db = TextStyle(
    fontSize: font_12,
    color: cl_db,
  );
  static TextStyle txStyle12_c9 = TextStyle(
    fontSize: font_12,
    color: cl_C9,
  );
  static TextStyle txStyle12_66 = TextStyle(
    fontSize: font_12,
    color: cl_66,
  );
  static TextStyle txStyle14_66 = TextStyle(
    fontSize: font_14,
    color: cl_66,
  );

  ///************************padding*************************
  static EdgeInsets paddingTitleRightText =
      EdgeInsets.only(left:UIDesign.dp20,right: UIDesign.dp20);
  static EdgeInsets paddingV32 = EdgeInsets.only(bottom: dp32, top: dp32);
}

最后在需要使用的地方调用UIdesing.xxx替代就行了
例如设计稿上10pt或者10dp,直接用UIDesign.dp10.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《Flutter入门疑难杂症》 Flutter的UI适配方案 的相关文章

  • Linux 系统中kill命令杀死进程常用技巧

    目录 前言 基础 进阶 1 查找进程号的方式进行改进 2 将常规的两步杀死进程合并为一步 3 强制踢掉登陆用户 kill的注意事项 前言 在Linux的系统中 kill是我们最常见的命令之一 kill 英语中为杀死的意思 顾名思义 就是用来
  • pytorch中使用detach()

    import torch nn as nn import torch class net nn Module def init self super init self conv nn Conv2d 3 6 3 stride 2 paddi
  • GOOGLE地图基站定位-Google Mobile Maps API

    如果你在你的手机装过Google Mobile Maps 你就可以发现只要你的手机能连接GPRS 即使没有GPS功能 也能定位到你手机所在的位置 只是精度不够准确 在探讨这个原理之前 我们需要了解一些移动知识 了解什么是MNC LAC Ce
  • Spark SQL 基本操作

    将下列JSON格式数据复制到Linux系统中 并保存命名为employee json id 1 name Ella age 36 id 2 name Bob age 29 id 3 name Jack age 29 id 4 name Ji
  • 【财富空间】一场史无前例的白领破产潮,正在来袭!

    来源 水木然 ID smr8700 最近 我们在上海做一个项目 准备招一个部门经理 于是发了招聘启示 应聘的人符合条件的很少 这不算什么 最令我吃惊的是 他们基本上个个都是要求年薪百万以上 放眼四望 诺大的上海 除去垄断国企 大牌的外企 再
  • xshell及xftp更新提示:Xshell出现要继续使用此程序必须应用到最新的更新或使用新版本

    一 前言 java开发者或者linux运维都肯定会用到xshell及xftp工具 说实话这两个工具真心是好用 但是有两个问题一直困扰这我 1 每次打开xshell或xftp总是会提示更新 2 今天打开xftp的时候 突然提示 要继续使用此程
  • Arduino基础 — Arduino 字符串

    Arduino 字符串 在Arduino编程中有两位字符串 1 字符数组 与C语言编程使用相同 2 Arduino 字符串 它允许我们在代码中使用字符对象 字符串数组 字符串是一个特殊的数组 在字符串的末尾有一个额外的元素 其值总是为0 零
  • 面试鹅厂,我三面被虐的体无完肤……

    戳蓝字 CSDN云计算 关注我们哦 作者 codegoose 来源 https segmentfault com a 1190000017864721 经过半年的沉淀 加上对MySQL redis和分布式这块的补齐 终于重拾面试信心 再次出
  • SOLO代码阅读解析

    SOLO是一种直接预测instance mask的范式 摒弃了之前top down和bottom up两种主流的实例分割方法 从而pipeline更加简洁直观 这篇文章以官方代码中的demo为例 简单梳理一下SOLO在inference时的
  • etcd编译与简单使用

    etcd是用go语言编写的 首先安装与配置go语言的环境 ubuntu1404安装go开发环境参考 http xhrwang me 2014 12 22 go dev env html http go ctolib com topics 3
  • 队列的C语言实现

    头文件 Queue h typedef int BTDataType typedef struct BindaryTreeNode BTDataType data struct BindaryTreeNode left struct Bin
  • Elasticsearch解决只能查询10000条数据方案

    es官方默认限制索引查询最多只能查询10000条数据 查询第10001条数据开始就会报错 Result window is too large from size must be less than or equal to 但是很多时候10
  • tan和atan--正切和反正切函数

    功能简介 求变量的正切和反正切 语法格式 1 Y tan X 求X中元素的正切值 元素可以为复数 tan函数是周期函数 以pi为一个周期 当元素值等于pi 2的奇数倍时 函数失去定义 在三角函数中 tan x sin x cos x 2 Y
  • P1025 数的划分(dfs/dp)

    题目 https www luogu com cn problem P1025 题目描述 将整数n分成k份 且每份不能为空 任意两个方案不相同 不考虑顺序 例如 n 7 k 3 下面三种分法被认为是相同的 1 1 5 1 5 1 5 1 1
  • 关于vscode头文件出现红色波浪曲线问题

    关于vscode头文件总显示红色波浪曲线解决 方法1 可以在设置中直接关掉 方法2 没有添加编译器的路径 我们可以找到gcc exe所在的路径 或者重新安装官网下载 解压到c盘非中文路径 复制路径 主要是看gcc g 所在的路径
  • 环信iOS使用步骤及使用总结

    环信iOS使用步骤及使用总结 第一步 集成 请参照环信官方文档http docs easemob com im 300iosclientintegration 20iossdkimport 集成 iOSSDK 在您阅读此文档时 我们假定您已
  • OpenAI最新官方ChatGPT聊天插件接口《插件部署上生产》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)

    Plugins in production 插件部署上生产 前言 Rate limits 速率限制 Updating your plugin 更新您的插件 Plugin terms Domain verification and secur
  • TCP与UDP的区别

    一 前言 TCP IP 中有两个具有代表性的传输层协议 分别是 TCP 和 UDP 二 TCP IP网络模型 计算机与网络设备要相互通信 双方就必须基于相同的方法 比如 如何探测到通信目标 由哪一边先发起通信 使用哪种语言进行通信 怎样结束

随机推荐

  • 因果推断4--Causal ML(个人笔记)

    目录 1 安装教程及官方文档 1 1 pip安装 1 2 API文档 1 3 代码仓库 2 Uplift模型与主要方法介绍 2 1 发放代金券 2 2 多treatment 2 3 实验方法 3 causalml inference tre
  • IDEA中使用单元测试(Junit)Scanner控制台无法输入问题解决 2022.12.13

    步骤 Help Edit Custom VM options 在idea64 exe vmoptions文件中最后一行添加如下内容 Deditable java test console true 操作完成保存后一定要重启IDEA ps 通
  • Vue中读取本地图片实现预览和上传

    先看效果图 上面展示了两张从本地添加的准备上传服务器的预览图片 效果还不错吧 哈哈哈 下面是该页面中紫色框的布局与实现代码 我想有些人也不喜欢HTML中默认的上传文件样式 实在辣眼睛
  • C\C++ 中的绝对值函数:abs()、cabs()、fabs()、labs()

    不同类型的数据使用不同类型的绝对值函数 整型 int abs int i 返回整型参数i的绝对值 复数 double cabs struct complex znum 返回复数znum的绝对值 双精度浮点型 double fabs doub
  • egg-swagger token验证无效解决方案

    先看效果 注意 我这边只讲重点 1 首先 egg swagger 怎么安装看我的这篇egg swagger demo 无数据库版 2 无swagger的 token 验证 我的这篇eggjs token生成和验证demo 3 我这边只讲 重
  • Raft一致性算法

    摘要 Raft 是一种为了管理复制日志的一致性算法 它提供了和 Paxos 算法相同的功能和性能 但是它的算法结构和 Paxos 不同 使得 Raft 算法更加容易理解并且更容易构建实际的系统 为了提升可理解性 Raft 将一致性算法分解成
  • Prometheus详解(四)——Prometheus简单使用

    今天继续给大家介绍Linux运维相关知识 本文主要内容是Prometheus简单使用 在上文Prometheus详解 三 Prometheus安装部署中 我们介绍了Prometheus的安装和部署 今天 我们就来介绍一下Prometheus
  • fork()父子进程变量之间的关系与信号的响应

    1 变量关系 根据 unix 高级环境编程 中的一句话 子进程和父进程继续执行fork调用之后的指令 子进程是父进程的副本 例如 子进程获取父进程数据空间 堆和栈的副本 注意 这是子进程所拥有的副本 父子进程并不共享这些存储空间部分 父子进
  • 尚品汇细节分析-Vue项目中如何实现自定义校验规则

    需求 当用户登录时 会输入用户名和密码 用户名不能为空 密码的长度不能小于6位 需要在用户在点击登录按钮前 进行验证是否通过我们设定的规则 如果通过则放行 如果不通过则会进行提示 效果图 结合Element UI来实现校验规则 1 页面元素
  • SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

    SQL SERVER 2000 遍历父子关系數據表 二叉树 获得所有子节点 所有父节点及节点层数函数 Geovin Du 涂聚文 建立測試環境 Create Table GeovinDu ID Int fatherID Int Name V
  • 课程设计-基于Java web的网吧管理系统

    项目编号 B01 项目名称 基于Java jsp Servlet的网吧管理系统 源码编号 BK05 项目类型 Java web项目 JavaEE 当前版本 V1 0 0版本 用户类型 只有管理员 单角色 项目架构 B S架构 设计思想 MV
  • IDEA快捷键(WIN10,持续更新)

    IDEA快捷键 以下所说的都是windows下的默认快捷键 可以通过File gt Settings gt Keymap 对快捷键进行修改 查看源码 ctrl 鼠标左键 重写父类方法 ctrl o 快速写for循环 20 for或fori
  • python给图片加雾

    调用的是cv2的addWeighted函数 增雾结果来看效果还蛮不错的 import numpy as np import cv2 as cv import os import random file C Users Ilearn Desk
  • C++图书管理系统(简单版)

    1 系统需求 图书管理系统是一个可以记录图书借记和存储的工具 本教程主要利用C 来实现一个图书管理系统 系统中需要实现的功能如下 添加书籍 向图书管理系统中添加新书 信息包括 书名 书的价格 书的编号 最多记录1000本 显示书籍 显示图书
  • STC15单片机实战项目 - 硬件调试

    硬件调试 一 调试工具 1 直流电源 测试5 28V供电 2 手机充电线 测试USB供电 程序烧录 3 万用表 测量电压 4 示波器 测量开关波形 纹波等 二 焊接样机 焊接好的样机如下图 说明 作为硬件工程师 平时要多练焊接 练就一流的焊
  • 第二课 什么是norm game?(An Evolutionary Approach to Norms)

    文章目录 前置课程 An Evolutionary Approach to Norms Simulation of the Norms Game first step second step third step fourth step f
  • 【论文笔记】Darts-可微神经架构搜索(一)

    是什么 darts是什么 全称 Differentiable ARchiTecture Search 它是一种新 2018 的NAS 神经架构搜索 方法 NAS是什么 全称 neural architecture search 神经架构搜索
  • JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!

    文章作者 夜幕团队 NightTeam 蔡老板 Loco 润色 校对 夜幕团队 NightTeam Loco 你是否也曾有过 在逆向时看到一大坨代码 但自己却无从下手 的遭遇 你是否也曾有过 跟着代码跳了很久之后 才发现那一大坨代码其实没有
  • MySQL的运行机制是什么?它有哪些引擎?

    目录 整个 SQL 的执行流程 1 查询缓存的利弊 2 如何选择数据库引 3 InnoDB 自增主键 整个 SQL 的执行流程 首先客户端端先要发送用户信息去服务端进行授权认证 如果使用的是命令行工具 通常需要输入如下信息 mysql h
  • 《Flutter入门疑难杂症》 Flutter的UI适配方案

    本文后面已经被我用新的extension大法替代咯 有兴趣的可以看我写的这篇文章 https blog csdn net WZAHD article details 111404843 spm 1001 2014 3001 5501 话不多