flutter开发安卓APP适配不同尺寸的手机屏幕
在使用 Flutter 开发 Android 应用时,适配不同尺寸的手机屏幕是一个非常重要的问题。Flutter 提供了多种机制来帮助你实现响应式布局和多设备适配。
✅ 一、理解 Flutter 中的屏幕适配核心概念
1. 逻辑像素(Logical Pixels)与设备像素(Device Pixels)
- Flutter 使用的是 逻辑像素(也叫设备独立像素),而不是物理像素。
MediaQuery
和LayoutBuilder
等工具可以帮助你获取当前设备的屏幕信息。
final size = MediaQuery.of(context).size;
print('屏幕宽度:${size.width}'); // 逻辑宽度
print('屏幕高度:${size.height}');
2. 设备像素比(Pixel Ratio)
- 可以通过
MediaQuery.of(context).devicePixelRatio
获取。 - 它表示一个逻辑像素对应多少个物理像素。
✅ 二、Flutter 布局适配技巧
1. 使用响应式布局组件
✅ LayoutBuilder
根据父容器大小动态构建 UI。
LayoutBuilder(builder: (context, constraints) {if (constraints.maxWidth > 600) {return DesktopView();} else {return MobileView();}},
);
✅ MediaQuery
获取屏幕宽高、方向等信息:
final width = MediaQuery.of(context).size.width;
final height = MediaQuery.of(context).size.height;
final orientation = MediaQuery.of(context).orientation;
✅ OrientationBuilder
根据横竖屏切换界面:
OrientationBuilder(builder: (context, orientation) {if (orientation == Orientation.portrait) {return PortraitLayout();} else {return LandscapeLayout();}},
);
2. 使用弹性布局组件
✅ Flex
, Row
, Column
, Expanded
, Flexible
这些是 Flutter 实现响应式布局的核心组件。
Row(children: [Expanded(child: Container(color: Colors.red)),Expanded(child: Container(color: Colors.blue)),],
)
✅ Wrap
/ GridView
/ ListView
自动换行或滚动布局,适合内容不确定的情况。
3. 使用 flutter_screenutil
插件进行适配(推荐)
这是一个流行的第三方库,可以实现字体、宽高、尺寸的自适应。
📦 安装:
dependencies:flutter_screenutil: ^5.0.0+1
🔧 初始化(在 main.dart
中设置设计稿尺寸):
void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return ScreenUtilInit(designSize: const Size(375, 812), // 设计稿的尺寸(如 iPhone 12)minTextAdapt: true,splitScreenMode: true,builder: (context, child) {return MaterialApp(home: child,);},child: MyHomePage(),);}
}
💡 使用方式:
Container(width: 100.w, // 自适应宽度height: 100.h, // 自适应高度margin: EdgeInsets.all(20.r), // 自适应边距child: Text('自适应文字', style: TextStyle(fontSize: 18.sp)), // 字体大小适配
)
.w
表示按宽度比例缩放
.h
表示按高度比例缩放
.r
表示按宽高中较小的比例缩放
.sp
表示字体大小适配
✅ 三、适配策略建议
场景 | 推荐做法 |
---|---|
不同分辨率的手机 | 使用 flutter_screenutil 或 LayoutBuilder |
横竖屏切换 | 使用 OrientationBuilder |
大屏设备(如平板) | 使用 LayoutBuilder 判断宽度,显示不同的布局 |
文字大小适配 | 使用 flutter_screenutil 的 .sp 单位 |
图片适配 | 使用 BoxFit , FittedBox , Image.asset(width: ...) , 或 flutter_screenutil 的 .w 控制 |
✅ 四、图片适配建议
Flutter 支持自动加载不同分辨率的图片资源:
assets/
├── images/
│ ├── icon.png // 默认(1.0x)
│ ├── 2.0x/icon.png
│ └── 3.0x/icon.png
在 pubspec.yaml
中配置:
flutter:assets:- assets/images/
然后使用:
Image.asset('assets/images/icon.png')
Flutter 会根据设备的 devicePixelRatio
自动选择合适的图片。
✅ 五、测试你的适配效果
你可以使用以下方法模拟不同设备:
1. 在 Android Studio / VS Code 中使用多个模拟器
- 创建多个 Android 虚拟设备(AVD),包含不同尺寸和分辨率
2. 使用 flutter emulators
命令管理模拟器
flutter emulators --launch Pixel_4_API_34
3. 使用真机测试
连接不同型号的安卓手机进行真实测试。
✅ 六、进阶建议
目标 | 方法 |
---|---|
适配折叠屏/大屏设备 | 使用 LayoutBuilder + MediaQuery 动态判断 |
多语言支持 | 使用 flutter_localizations 和 intl 包 |
主题适配 | 使用 ThemeData 和 MediaQuery.platformBrightness 判断深色模式 |
适配 Web 和桌面端 | 同样适用上述响应式布局方法 |
✅ 示例代码:简单适配布局
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';void main() => runApp(MyApp());class MyApp extends StatelessWidget {Widget build(BuildContext context) {return ScreenUtilInit(designSize: const Size(375, 812),builder: (context, child) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('适配示例'.sp)),body: Center(child: Container(width: 300.w,height: 100.h,color: Colors.blue,child: Center(child: Text('Hello World', style: TextStyle(fontSize: 20.sp))),),),),);},);}
}
✅ 总结
工具/方法 | 说明 |
---|---|
flutter_screenutil | 强烈推荐,轻松实现尺寸、字体适配 |
MediaQuery / LayoutBuilder | 核心响应式布局工具 |
Expanded / Flexible / Wrap / ListView | 弹性布局必备组件 |
图片适配 | 使用多分辨率资源目录 |
测试 | 使用 AVD、真机、云测试平台 |