Flutter响应式布局插件flutter_responsive_scale的使用
Flutter响应式布局插件flutter_responsive_scale的使用
概述
flutter_responsive_scale
是一个用于适应屏幕和字体大小的Flutter插件。通过使用设备缩放,可以让UI在不同屏幕尺寸上合理布局。
示例
特点
- 响应式UI
- 简单的UI工具
- 易于使用
- 支持响应查询选项(fontScale, yScale 和 width scale)
使用方法
添加依赖
请在安装前检查最新版本。如果新版本有问题,请使用旧版本。
dependencies:
flutter:
sdk: flutter
# 添加 flutter_responsive_scale
flutter_responsive_scale: ^{latest version}
导入库
在Dart代码中添加以下导入语句:
import 'package:flutter_responsive_scale/flutter_responsive_scale.dart';
属性
属性 | 类型 | 参数 | 描述 |
---|---|---|---|
context.Scale(size) | 函数 | double required | 设备设计中每个像素的比例。例如,160px屏幕上的一个像素等于320px屏幕上的两个像素。也是scaleX的别名。 |
context.fontScale(14) | 函数 | double required | 相对于实际设备的字体大小设置。 |
context.scaleY() | 函数 | double required | 参考设备配置 - 参考宽度(默认为414px,即iPhone XS Max)。参考高度(默认为896px,即iPhone XS Max),允许自动缩放字体大小(默认为true)。 |
ResponsiveScaleConfig | 类 | height (double), width (double), allowFontScaling (bool - true) | 设计草案的像素比例,垂直方向上。 |
初始化并根据系统字体大小调整
请在使用前设置设计草稿的缩放配置,包括设计草稿的宽度、高度以及是否允许字体缩放。
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return ResponsiveScale(
config: const ResponsiveScaleConfig(),
child: MaterialApp(
title: 'Responsive scale demo',
theme: ThemeData.dark(),
home: const ScaleTestPage(
title: 'Hi , Flutter dev - ',
),
),
);
}
}
示例代码
import 'package:flutter/material.dart';
import 'package:flutter_responsive_scale/flutter_responsive_scale.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return ResponsiveScale(
config: const ResponsiveScaleConfig(),
child: MaterialApp(
title: 'Responsive scale demo',
theme: ThemeData.dark(),
home: const ScaleTestPage(
title: 'Hi , Flutter dev - ',
),
),
);
}
}
class ScaleTestPage extends StatelessWidget {
const ScaleTestPage({Key? key, required this.title}) : super(key: key);
final String title;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text(title)),
body: SingleChildScrollView(
padding: EdgeInsets.symmetric(
horizontal: context.scale(7),
),
child: Center(
child: Column(
children: <Widget>[
SizedBox(height: context.scale(16)),
Text(
'Designed at ${ResponsiveScale.of(context).width} x ${ResponsiveScale.of(context).height}',
style: TextStyle(
fontSize: context.fontScale(16),
),
textAlign: TextAlign.center,
),
SizedBox(
height: context.scale(16),
),
Container(
alignment: Alignment.topLeft,
padding: EdgeInsets.only(
bottom: context.scaleY(10),
),
child: Text(
'With scale box',
style: TextStyle(
fontSize: context.fontScale(14),
),
textAlign: TextAlign.left,
),
),
RenderBoxes(
size: Size.square(
context.scale(100),
),
color: Colors.red,
label: const ["100dp", "100dp"],
),
SizedBox(
height: context.scale(16),
),
Container(
alignment: Alignment.topLeft,
padding: EdgeInsets.only(
bottom: context.scaleY(10),
),
child: Text(
'Without scale box',
style: TextStyle(
fontSize: context.fontScale(14),
),
textAlign: TextAlign.left,
),
),
const RenderBoxes(
size: Size.square(
100,
),
color: Colors.blue,
label: ["100", "100"],
),
SizedBox(
height: context.scale(16),
),
const Text(
'The text font size is fixed at 24',
style: TextStyle(
fontSize: 24,
),
textAlign: TextAlign.center,
),
SizedBox(
height: context.scale(16),
),
Text(
'The text font size is flexible at 24',
style: TextStyle(
fontSize: context.fontScale(24),
),
textAlign: TextAlign.center,
),
SizedBox(
height: context.scale(48),
),
],
),
),
),
);
}
}
class RenderBoxes extends StatelessWidget {
const RenderBoxes({required this.size, this.color, required this.label, Key? key}) : super(key: key);
final Size size;
final Color? color;
final List<String> label;
[@override](/user/override)
Widget build(BuildContext context) {
return Row(
children: List.generate(
4,
(_) => Container(
width: size.width,
height: size.height,
color: color,
child: Center(
child: Text(
label.join("\nx\n"),
style: TextStyle(
fontSize: context.fontScale(14),
),
textAlign: TextAlign.center,
),
),
),
),
);
}
}
更多关于Flutter响应式布局插件flutter_responsive_scale的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter响应式布局插件flutter_responsive_scale的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用flutter_responsive_scale
插件来实现响应式布局的示例代码。这个插件可以帮助你根据屏幕尺寸和分辨率自动调整UI元素的尺寸。
首先,你需要在你的pubspec.yaml
文件中添加flutter_responsive_scale
依赖:
dependencies:
flutter:
sdk: flutter
flutter_responsive_scale: ^x.x.x # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中使用flutter_responsive_scale
。以下是一个简单的示例,展示了如何使用它来创建响应式UI:
import 'package:flutter/material.dart';
import 'package:flutter_responsive_scale/flutter_responsive_scale.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Responsive Scale Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Responsive Scale Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
// 使用 ResponsiveSizer 来创建一个响应式大小的文本
ResponsiveSizer(
scales: [1.0, 1.2, 1.5], // 分别在 [小, 中, 大] 屏幕尺寸上应用的缩放比例
child: Text(
'Hello, Flutter!',
style: TextStyle(
fontSize: 24.rs, // 使用 rs 单位来自动缩放字体大小
),
),
),
SizedBox(height: 20.rs), // 使用 rs 单位来自动缩放间距
// 使用 ResponsiveGrid 来创建一个响应式网格布局
ResponsiveGrid(
columns: 2, // 定义网格列数
gap: 10.rs, // 定义网格间距,使用 rs 单位
children: <Widget>[
Container(
color: Colors.blue,
child: Center(child: Text('Box 1')),
),
Container(
color: Colors.green,
child: Center(child: Text('Box 2')),
),
Container(
color: Colors.red,
child: Center(child: Text('Box 3')),
),
Container(
color: Colors.yellow,
child: Center(child: Text('Box 4')),
),
],
),
],
),
),
);
}
}
在这个示例中:
- 我们使用
ResponsiveSizer
来创建一个响应式大小的文本。fontSize: 24.rs
表示字体大小会根据屏幕尺寸自动缩放。 SizedBox(height: 20.rs)
中的20.rs
表示高度会根据屏幕尺寸自动缩放。ResponsiveGrid
用于创建一个响应式网格布局,其中columns: 2
表示网格有两列,gap: 10.rs
表示网格之间的间距会根据屏幕尺寸自动缩放。
通过这些方式,你可以使用flutter_responsive_scale
插件来实现响应式布局,使你的Flutter应用在不同设备和屏幕尺寸上都能有良好的显示效果。