Flutter响应式布局插件flutter_responsive的使用
Flutter响应式布局插件 flutter_responsive
的使用
flutter_responsive
插件提供了一种简单且高效的方式来为Flutter应用程序创建响应式布局,适用于移动、桌面和Web平台。该插件允许你的布局根据父元素的大小自动调整和包裹小部件(如容器、行、列和富文本)。
关于插件
由Rafael Setragni为Flutter社区开发。
许可证
该项目遵循GNU通用公共许可证V3,这意味着你可以自由修改项目,但需要将改进分享回社区。要贡献改进,请先Fork此项目,进行必要的更改,然后提交Pull Request。别忘了在Issues页面上分享你的想法和需求。
重要说明
- 该插件基于Bootstrap Web Project,但尚未实现所有功能。
- 列的响应性基于全局屏幕尺寸,类似于Bootstrap的做法。
- 所有小部件包含边距、填充、宽度、高度(最大和最小边缘),类似于HTML中的
div
元素。
如何使用
首先,在pubspec.yaml
文件中添加依赖:
dependencies:
flutter_responsive: ^0.0.6 # 请确保使用最新版本
然后在.dart
文件中导入:
import 'package:flutter_responsive/flutter_responsive.dart';
可以自由使用ResponsiveContainer
、ResponsiveRow
、ResponsiveCol
和JSX
等小部件。
屏幕尺寸
该插件基于Bootstrap项目,将屏幕分为12列,并考虑了7种屏幕尺寸:
- US - 超小屏幕 - 0px至309px
- XS - 特小屏幕 - 310px至575px
- SM - 小屏幕 - 576px至767px
- MD - 中屏幕 - 768px至991px
- LG - 大屏幕 - 992px至1199px
- XL - 特大屏幕 - 1200px至1999px
- UL - 超大屏幕 - 2000px及以上
自定义限制(可选)
可以根据需要自定义所有限制,通过修改ResponsiveScreen
类中的限制哈希映射:
/* Map<String, double> */
ResponsiveScreen.limits = {
ScreenSize.us: 0.00,
ScreenSize.xs: 310.00,
ScreenSize.sm: 576.00,
ScreenSize.md: 768.00,
ScreenSize.lg: 992.00,
ScreenSize.xl: 1200.00,
ScreenSize.ul: 2000.00,
};
网格使用
该插件有三个主要网格元素:
ResponsiveContainer
用于容纳页面的所有元素,例如行和列,集中内容并限制最大宽度:
ResponsiveContainer(
widthLimit: ResponsiveScreen.limits[ScreenSize.lg],
margin: EdgeInsets.symmetric(horizontal: 10),
children: <Widget>[
ResponsiveRow(),
ResponsiveRow(),
ResponsiveRow(),
]
)
ResponsiveRow
包含多个列或其他小部件的容器。注意:不需要将内部小部件包装到ResponsiveCol
对象中:
ResponsiveRow(
margin: EdgeInsets.only(top: 20, bottom: 5),
children: <Widget>[
ResponsiveCol(),
ResponsiveCol(),
ResponsiveCol(),
Text('可以直接在ResponsiveRow中使用其他小部件')
]
)
ResponsiveCol
示例代码如下:
ResponsiveCol(
margin: EdgeInsets.all(10),
padding: EdgeInsets.all(10),
backgroundColor: Colors.blue,
gridSizes: {
ScreenSize.xs : 4,
ScreenSize.sm : 3,
ScreenSize.lg : 2,
ScreenSize.xl : 1,
},
children: [
Text('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
]
)
完整示例
import 'package:flutter/material.dart';
import 'package:flutter_responsive/flutter_responsive.dart';
class HomePage extends StatefulWidget {
@override
_HomePage createState() => _HomePage();
}
class _HomePage extends State<HomePage> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
List<Widget> responsiveGridExample =
List<int>.generate(12, (index) => index).map((colIndex) =>
ResponsiveCol(
padding: EdgeInsets.all(10),
backgroundColor: Colors.blue,
gridSizes: {
ScreenSize.xs : 4,
ScreenSize.sm : 3,
ScreenSize.lg : 2,
ScreenSize.xl : 1,
},
children: [
Text('Lorem ipsum dolor sit amet, consectetur adipiscing elit')
]
)
).toList();
MediaQueryData mediaQuery = MediaQuery.of(context);
return Scaffold(
appBar: AppBar(
title: const Text('Home', overflow: TextOverflow.ellipsis),
),
body: Container(
color: Color(0xFFCCCCCC),
child: ListView(
children: <Widget>[
ResponsiveContainer(
margin: EdgeInsets.symmetric(vertical: 10),
padding: EdgeInsets.symmetric(horizontal: 10),
backgroundColor: Colors.white,
widthLimit: mediaQuery.size.width * 0.95,
children: <Widget>[
ResponsiveRow(
margin: EdgeInsets.symmetric(vertical: 10),
children: <Widget>[
ResponsiveCol(
padding: EdgeInsets.all(10),
margin: EdgeInsets.only(bottom: 20),
backgroundColor: Colors.blueGrey,
children: [
Text('Flutter Responsive Layout', style: JSXTypography.h4.merge(TextStyle(color: Colors.white)))
]
),
]
),
ResponsiveRow(
margin: EdgeInsets.symmetric(vertical: 10),
children: <Widget>[
ResponsiveCol(
children: [
JSX(
shrinkToFit: true,
padding: EdgeInsets.only(bottom: 20),
stylesheet: {
'h3': JSXStylesheet(
textStyle: TextStyle(color: Theme.of(context).primaryColor),
displayLine: DisplayLine.block
),
'h6': JSXStylesheet(
textStyle: TextStyle(color: Theme.of(context).primaryColor),
displayLine: DisplayLine.block
)
},
margin: EdgeInsets.symmetric(horizontal: 10, vertical: 20),
text: '''
<div>
<h3>Responsive Layouts</h3><h6>for <i>Flutter</i></h6>
<br><br>
<p>This <b>RichText</b> was easily produced and personalized using pure HTML</p>
<p>Bellow there is an example of 12 columns, wich changes the amount of each line depending of his father´s widget size.</p>
</div>''',
)
]
)
]..addAll(responsiveGridExample)
)
],
)
],
),
)
);
}
}
最终效果
如何运行插件示例
要运行完整示例应用,请按照以下步骤操作:
- 使用GitHub Desktop或其他Git程序将此项目克隆到本地机器。
- 下载Android Studio和最新的Flutter SDK到本地机器,并正确配置它们。
- 运行
flutter pub get
更新所有依赖项。 - 在模拟器或真实设备上调试
example/lib/main.dart
文件或位于test
文件夹中的任何单元测试用例。 - 若要正确运行性能测试,请使用
flutter run --release
运行应用。
更多关于Flutter响应式布局插件flutter_responsive的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter响应式布局插件flutter_responsive的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用flutter_responsive
插件来实现响应式布局的示例代码。
首先,确保你已经在pubspec.yaml
文件中添加了flutter_responsive
依赖:
dependencies:
flutter:
sdk: flutter
flutter_responsive: ^2.0.0 # 请检查最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤配置和使用flutter_responsive
。
1. 配置flutter_responsive
在你的main.dart
文件中,首先导入flutter_responsive
包,并配置它:
import 'package:flutter/material.dart';
import 'package:flutter_responsive/flutter_responsive.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ResponsiveWrapper.builder(
// 默认的断点
defaultBreakpoints: ResponsiveBreakpoints.values,
// 允许屏幕旋转时重新构建布局
allowOrientationChanges: true,
// 根据屏幕大小自动调整字体大小
autoScale: true,
// 最小字体大小
minFontSize: 12.0,
// 最大字体大小
maxFontSize: 18.0,
// 自定义响应式设置
customBreakpoints: {
'TABLET': 600,
'LAPTOP': 1024,
'DESKTOP': 1440,
},
child: MaterialApp(
title: 'Flutter Responsive Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
),
);
}
}
2. 使用响应式布局
在你的MyHomePage
中,你可以使用ResponsiveBuilder
来根据屏幕尺寸调整布局:
import 'package:flutter/material.dart';
import 'package:flutter_responsive/flutter_responsive.dart';
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Responsive Layout Demo'),
),
body: ResponsiveBuilder(
builder: (context, sizingInformation) {
return LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Screen Size: ${sizingInformation.screenSize}',
style: TextStyle(fontSize: sizingInformation.fontSize(16)),
),
SizedBox(height: sizingInformation.verticalGap),
if (sizingInformation.isDesktop || sizingInformation.isLaptop) ...[
// 桌面或笔记本布局
Container(
width: constraints.maxWidth * 0.8,
height: constraints.maxHeight * 0.4,
color: Colors.amber,
child: Center(child: Text('Desktop/Laptop View')),
),
SizedBox(height: sizingInformation.verticalGap),
] else if (sizingInformation.isTablet) ...[
// 平板布局
Container(
width: constraints.maxWidth * 0.9,
height: constraints.maxHeight * 0.5,
color: Colors.lightBlueAccent,
child: Center(child: Text('Tablet View')),
),
SizedBox(height: sizingInformation.verticalGap),
] else ...[
// 手机布局
Container(
width: constraints.maxWidth,
height: constraints.maxHeight * 0.6,
color: Colors.green,
child: Center(child: Text('Mobile View')),
),
SizedBox(height: sizingInformation.verticalGap),
],
],
),
);
},
);
},
),
);
}
}
在这个示例中,我们使用了ResponsiveBuilder
来获取屏幕尺寸信息和字体大小调整功能。通过sizingInformation.screenSize
和sizingInformation.fontSize
,我们可以动态调整布局和字体大小。此外,我们还使用了sizingInformation.isDesktop
、sizingInformation.isLaptop
和sizingInformation.isTablet
来判断当前设备的类型,从而显示不同的布局。
希望这个示例代码能帮助你理解如何在Flutter项目中使用flutter_responsive
插件来实现响应式布局。