Flutter-屏幕适配方案

简介: 我相信每个移动端开发者都避不开这个问题,就是屏幕适配。

前言:我相信每个移动端开发者都避不开这个问题,就是屏幕适配

目前移动端的设备已经非常多,并且不同的设备手机屏幕也不相同。

目前做移动端开发都要针对不同的设备进行一定的适配,无论是移动原生开发、小程序、H5页面。

所以这篇文章咱们来讲讲屏幕适配,阿里P7告诉我的适配方案!

最最最重要的一点:宽度一般根据屏幕宽度算 高度看情况 文字按UI的来 高度不限制!!!

多使用Expanded这样自适应的组件!!

我们可以根据设备信息来进行适配:

获取屏幕上的一些信息,可以通过MediaQuery:

// 1.媒体查询信息
final mediaQueryData = MediaQuery.of(context);

// 2.获取宽度和高度
final screenWidth = mediaQueryData.size.width;
final screenHeight = mediaQueryData.size.height;
final physicalWidth = window.physicalSize.width;
final physicalHeight = window.physicalSize.height;
final dpr = window.devicePixelRatio;
print("屏幕width:$screenWidth height:$screenHeight");
print("分辨率: $physicalWidth - $physicalHeight");
print("dpr: $dpr");

// 3.状态栏的高度
// 有刘海的屏幕:44 没有刘海的屏幕为20
final statusBarHeight = mediaQueryData.padding.top;
// 有刘海的屏幕:34 没有刘海的屏幕0
final bottomHeight = mediaQueryData.padding.bottom;
print("状态栏height: $statusBarHeight 底部高度:$bottomHeight");

咱们有两种适配方式:

1,自己根据设备信息组装,这样可以更好的实现自己需要的功能

2,使用第三方库:flutter_screenutil(功能也很强大,主要使用很方便)

咱们两种方式都讲一讲,哈哈

img

1,自己根据设备信息组装

import 'package:flutter/material.dart';
import 'dart:ui';

class ScreenAdapt {
  //屏幕参数获取api
  static MediaQueryData mediaQuery = MediaQueryData.fromWindow(window);
  static double screenwidth; //设备屏幕宽度width
  static double screenheight; //设备屏幕高度height
  static double topheight; //顶部空白高度
  static double bottomheight; //底部空白高度
  static double devicepixelratio = mediaQuery.devicePixelRatio; //分辨比
  static var screenratio; //屏幕宽比
  //初始化  uinumber:UI设计图 比如750、1920等
  static initialize(int uinumber) {
    screenwidth = mediaQuery.size.width;
    screenheight = mediaQuery.size.height;
    int uiwidth = uinumber is int ? uinumber : 750; //默认是1920 ui设计图
    screenratio = screenwidth / uiwidth; //屏幕宽比  设备宽度 : ui设计图宽度
  }

  //实际填写长度
  static px(number) {
    if (!(screenratio is double || screenratio is int)) {
      ScreenAdapt.initialize(750);
    }
    return number * screenratio; //返回处理好的长度数值
  }

  //获取设备屏幕宽度
  static screenWidth() {
    screenwidth = mediaQuery.size.width;
    return screenwidth;
  }

  //获取设备屏幕高度
  static screenHeight() {
    screenheight = mediaQuery.size.height;
    return screenheight;
  }

  //获取设备顶部空白高度
  static topHeight() {
    topheight = mediaQuery.padding.top;
    return topheight;
  }

  //获取设备底部空白高度
  static bottomHeight() {
    bottomheight = mediaQuery.padding.bottom;
    return bottomheight;
  }
}

使用实例

Container(
              width: ScreenAdapt.px(1500),
              //height: ScreenAdapt.px(800),尽量不去设置高度
              decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(23.0),
                  image: DecorationImage(
                      image: new NetworkImage(
                          "https://i.henghajiang.com/login_img.png"),
                      fit: BoxFit.none)),
            ),

注意一点,这里的长宽分别指什么哦

这个封装比较简单,大家可以自己diy

img

2,使用第三方库:flutter_screenutil

(1)引入步骤:

​ pubspec.yaml中引入最新的:

​ flutter_screenutil: ^5.0.0 #屏幕适配 (这个版本功能完全够用)

(2)初始化:

​ 一定是要在State的build中初始化
请添加图片描述

在4.0.0之前的版本呢初始化时这样的:

ScreenUtil.init(context, width: 750, height: 1334, allowFontScaling: false);

之后呢是这样的:

ScreenUtil.init(
  BoxConstraints(
      maxWidth: MediaQuery.of(context).size.width,
      maxHeight: MediaQuery.of(context).size.height),
  designSize: Size(750, 1334),
);

(3) 使用方式

dart版本2.0.0之前:

Container(
  width:ScreenUtil().setWidth(200)
  height:ScreenUtil().setHeight(180)
}

dart版本2.0.0之后(包括2.0.0):

Container(
  width:200.w
  height:180.h
}

长宽相等:

Container(
  width:200.w
  height:200.w
)

其他的api:

ScreenUtil.pixelRatio       //设备的像素密度
ScreenUtil.screenWidth      //设备宽度
ScreenUtil.screenHeight     //设备高度
ScreenUtil.bottomBarHeight  //底部安全区距离,适用于全面屏下面有按键的
ScreenUtil.statusBarHeight  //状态栏高度 刘海屏会更高  单位px
ScreenUtil.textScaleFactory //系统字体缩放比例
   
ScreenUtil.getInstance().scaleWidth  // 实际宽度的dp与设计稿px的比例
ScreenUtil.getInstance().scaleHeight // 实际高度的dp与设计稿px的比例

是不是很简单!记住这句话:宽度一般根据屏幕宽度算 高度看情况 文字按UI的来 高度不限制!!!

配合自适应组件,完美适配屏幕!!

欢迎留言纠正 ~ 不妨给个点赞哈哈

相关文章
|
20天前
|
编解码 安全 小程序
Flutter屏幕适配
Flutter屏幕适配
|
4月前
|
Linux 开发者 iOS开发
Flutter笔记:桌面端应用多窗口管理方案
Flutter笔记:桌面端应用多窗口管理方案
124 0
|
4月前
flutter中使用图标(含自制图标库方案)
flutter中使用图标(含自制图标库方案)
146 0
|
5月前
|
API
Flutter状态管理终极方案GetX第一篇——路由
Flutter状态管理终极方案GetX第一篇——路由 GetX是Flutter中一个非常流行的状态管理库,它不仅提供了简单易用的状态管理功能,还可以帮助我们方便地管理路由。在这篇文章中,我们将介绍如何使用GetX来实现路由管理。
147 0
|
5月前
|
开发者
Flutter状态管理终极方案GetX第二篇——状态管理
Flutter状态管理终极方案GetX第二篇——状态管理 在Flutter应用程序中,状态管理是必不可少的。GetX提供了简单易用的状态管理方案,使得开发者可以更加轻松地管理应用程序状态。下面介绍GetX中的状态管理方案。
112 0
|
7月前
|
Dart 前端开发 JavaScript
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
掌握这个关键技术,让你的APP开发事半功倍!——Flutter与其他方案的区别
49 0
|
编解码 移动开发 小程序
Flutter屏幕适配
目前移动端的设备已经非常多,并且不同的设备手机屏幕也不相同。 目前做移动端开发都要针对不同的设备进行一定的适配,无论是移动原生开发、小程序、H5页面。 Flutter中如何针对不同的手机屏幕来进行适配呢?我们一起来聊聊这个话题。
908 0
Flutter屏幕适配
|
Android开发 iOS开发
flutter外接纹理实现方案
Flutter外部纹理是一种可以在Flutter中显示Android或iOS原生视图的技术。它允许您在Flutter应用程序中嵌入其他平台的视图,并且这些视图会像普通Flutter小部件一样被处理。
flutter外接纹理实现方案
|
容器
flutter 溢出七种布局方案
flutter 溢出七种布局方案
289 0
flutter 溢出七种布局方案
|
数据可视化 IDE Java
Flutter框架在项目中使用App Manifest检查用户界面以及配置混乱之后对于构建配置的方案【Flutter】
Flutter框架在项目中使用App Manifest检查用户界面以及配置混乱之后对于构建配置的方案【Flutter】