Flutter屏幕断点检测插件screen_breakpoints的使用
Flutter屏幕断点检测插件screen_breakpoints的使用
特性
- 极其简单的实现
- 支持有和无配置
- 可定制化
- 提供Bootstrap断点或Material Design断点
断点
默认断点(Bootstrap)
尺寸 | 名称 | 最小宽度 |
---|---|---|
超小 | xs/none | 0 |
小 | sm | ≥576 |
中 | md | ≥768 |
大 | lg | ≥992 |
超大 | xl | ≥1200 |
超超大 | xxl | ≥1400 |
Material Design断点
尺寸 | 名称 | 最小宽度 |
---|---|---|
超小 | xs/none | 0 |
小 | sm | ≥600 |
中 | md | ≥905 |
大 | lg | ≥1240 |
超大 | xl | ≥1440 |
超超大 | xxl | - |
开始使用
导入库
import 'package:screen_breakpoints/screen_breakpoints.dart';
配置断点
如果你想要个性化所有的断点,可以将任何部件包装在MaterialApp
(或其他任何你使用的App)之上。例如:
/* ... */
// 这里是默认配置
const myBreakpoints = BreakpointConfiguration(
xs: const Breakpoint(breakpoint: 0, width: double.infinity, margin: null, padding: 16, columns: 4),
sm: const Breakpoint(breakpoint: 576, width: 540, margin: null, padding: 16, columns: 8),
md: const Breakpoint(breakpoint: 768, width: 720, margin: null, padding: 16, columns: 12),
lg: const Breakpoint(breakpoint: 992, width: 960, margin: null, padding: 16, columns: 12),
xl: const Breakpoint(breakpoint: 1200, width: 1140, margin: null, padding: 24, columns: 12),
xxl: const Breakpoint(breakpoint: 1400, width: 1320, margin: null, padding: 24, columns: 12),
);
Widget build(BuildContext context) {
return BreakpointConfigurator(
configuration: myBreakpoints,
child: MaterialApp(
/* ... */
),
);
}
/* ... */
每个断点都是一个Breakpoint
类型,每个断点必须比前一个高,如果设置为NULL,则会默认使用前一个。
默认的断点基于Bootstrap。要使用Material Design断点,将配置参数更改为kMaterialBreakpoints
:
/* ... */
Widget build(BuildContext context) {
return BreakpointConfigurator(
configuration: kMaterialBreakpoints,
child: MaterialApp(
/* ... */
),
);
}
/* ... */
不配置直接使用
否则,你可以直接使用它,它将使用默认设置。
使用方式
这个包包含两个基本的Widget,你可以使用它们:
BreakpointContainer
如果你想要在一个容器中放置对象,并根据断点调整大小,可以使用这个组件。通常适用于Scaffold
的body。它可以自动替换当前断点匹配的子部件。
示例代码:
/* ... */
Scaffold(
appBar: AppBar(
title: const BreakpointContainer(
fluid: true,
alignment: Alignment.center,
xlChild: Text('Sample Items - Desktop'),
mdChild: Text('Sample Items - Tablet'),
child: Text('Sample Items - Mobile'),
),
),
body: BreakpointContainer(
decoration: BoxDecoration(color: theme.cardColor),
xlChild: _DesktopView(),
mdChild: _TabletView(),
child: _MobileView(),
),
);
/* ... */
参数列表:
BreakpointContainer(
height: // 容器高度
decoration: // 居中的容器装饰
backgroundDecoration: // 背景容器装饰
foregroundDecoration: // 前景装饰在居中的容器顶部
alignment: // 居中的容器对齐方式
clipBehavior: // 居中的容器剪裁行为
fluid: // 设置fluid为true将忽略断点的宽度和边距
xxlChild: // 在XXL断点时显示的子部件,如果没有则使用下一个
xlChild: // 在XL断点时显示的子部件,如果没有则使用下一个
lgChild: // 在LG断点时显示的子部件,如果没有则使用下一个
mdChild: // 在MD断点时显示的子部件,如果没有则使用下一个
smChild: // 在SM断点时显示的子部件,如果没有则使用下一个
child: // 在XS及以上断点时显示的子部件,这是必需的
);
BreakpointBuilder
这是一个基于BreakpointContainer
的构建器。如果你需要为每个断点构建复杂的布局,可以使用这个。它在每次重建时都会提供BuildContext
、Breakpoint
和BreakpointConfiguration
。
示例代码:
/* ... */
Scaffold(
/* ... */
body: BreakpointBuilder(
decoration: BoxDecoration(color: theme.cardColor),
builder: (context, breakpoint, configuration) {
if(breakpoint >= configuration.xl) return _DesktopView();
if(breakpoint >= configuration.md) return _TabletView();
return _MobileView();
}
),
/* ... */
);
/* ... */
上述示例的结果与之前的BreakpointContainer
相同,这里的主要区别是你有一个带有上下文的构建器,因此你可以更好地控制结果。
参数列表:
BreakpointContainer(
builder: // 构建小部件的构建器
height: // 容器高度
decoration: // 居中的容器装饰
backgroundDecoration: // 背景容器装饰
foregroundDecoration: // 前景装饰在居中的容器顶部
alignment: // 居中的容器对齐方式
clipBehavior: // 居中的容器剪裁行为
fluid: // 设置fluid为true将忽略断点的宽度和边距
);
查找当前断点
有一种简单的方法可以从BuildContext
或MediaQuery
中查找当前断点。只需在build
函数中键入以下内容:
Widget build(BuildContext context) {
// 从Build Context
final breakpoint = Breakpoint.fromContext(context);
// 替代方法
final breakpoint = context.breakpoint;
// 从Media Query
final mediaQuery = MediaQuery.of(context);
final breakpoint = Breakpoint.fromMediaQuery(mediaQuery);
}
示例代码
import 'package:flutter/material.dart';
import 'package:screen_breakpoints/screen_breakpoints.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// 拷贝自Material Design
static const breakpoints = BreakpointConfiguration(
xs: Breakpoint(breakpoint: 0, width: double.infinity, margin: 16, padding: 0, columns: 4),
sm: Breakpoint(breakpoint: 600, width: double.infinity, margin: 32, padding: 0, columns: 8),
md: Breakpoint(breakpoint: 905, width: 840, margin: null, padding: 0, columns: 12),
lg: Breakpoint(breakpoint: 1240, width: double.infinity, margin: 200, padding: 0, columns: 12),
xl: Breakpoint(breakpoint: 1440, width: 1040, margin: null, padding: 0, columns: 12),
xxl: null,
);
[@override](/user/override)
Widget build(BuildContext context) {
return BreakpointConfigurator(
configuration: breakpoints,
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: BreakpointContainer(
fluid: true,
alignment: Alignment.center,
xlChild: Text('${widget.title} - Desktop'),
mdChild: Text('${widget.title} - Tablet'),
child: Text('${widget.title} - Mobile'),
),
),
body: BreakpointContainer(
xlChild: _DesktopView(counter: _counter),
mdChild: _TabletView(counter: _counter),
child: _MobileView(counter: _counter),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
class _MobileView extends StatelessWidget {
final int counter;
const _MobileView({Key? key, required this.counter}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
color: Colors.green,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
);
}
}
class _TabletView extends StatelessWidget {
final int counter;
const _TabletView({Key? key, required this.counter}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
color: Colors.blue,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
);
}
}
class _DesktopView extends StatelessWidget {
final int counter;
const _DesktopView({Key? key, required this.counter}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Container(
color: Colors.red,
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
);
}
}
更多关于Flutter屏幕断点检测插件screen_breakpoints的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter屏幕断点检测插件screen_breakpoints的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用screen_breakpoints
插件来实现屏幕断点检测的示例代码。这个插件可以帮助你根据不同的屏幕尺寸应用不同的布局。
首先,你需要在你的pubspec.yaml
文件中添加screen_breakpoints
依赖:
dependencies:
flutter:
sdk: flutter
screen_breakpoints: ^x.y.z # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中按照以下步骤使用screen_breakpoints
:
- 导入插件:
在你的Dart文件中导入screen_breakpoints
插件:
import 'package:screen_breakpoints/screen_breakpoints.dart';
- 定义断点:
你可以根据自己的需求定义不同的断点。例如:
final ScreenBreakpoints breakpoints = ScreenBreakpoints(
small: 600,
medium: 960,
large: 1200,
xlarge: 1920,
);
- 使用断点:
使用ScreenBreakpoints
类中的方法来检测当前的屏幕尺寸,并根据断点应用不同的布局。例如,你可以在build
方法中使用LayoutBuilder
结合breakpoints
来实现响应式布局:
import 'package:flutter/material.dart';
import 'package:screen_breakpoints/screen_breakpoints.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final ScreenBreakpoints breakpoints = ScreenBreakpoints(
small: 600,
medium: 960,
large: 1200,
xlarge: 1920,
);
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Screen Breakpoints Example'),
),
body: LayoutBuilder(
builder: (context, constraints) {
if (breakpoints.isSmall(constraints.maxWidth)) {
return Center(child: Text('Small Screen'));
} else if (breakpoints.isMedium(constraints.maxWidth)) {
return Center(child: Text('Medium Screen'));
} else if (breakpoints.isLarge(constraints.maxWidth)) {
return Center(child: Text('Large Screen'));
} else if (breakpoints.isXLarge(constraints.maxWidth)) {
return Center(child: Text('XLarge Screen'));
} else {
return Center(child: Text('Unknown Screen Size'));
}
},
),
),
);
}
}
在这个示例中,我们根据屏幕尺寸显示不同的文本。breakpoints.isSmall
、breakpoints.isMedium
、breakpoints.isLarge
和breakpoints.isXLarge
方法分别用于检测当前屏幕尺寸是否在某个断点范围内。
这个示例展示了如何使用screen_breakpoints
插件来检测屏幕尺寸并根据断点应用不同的布局。你可以根据自己的需求进一步扩展这个示例,例如使用不同的Widget或布局来适应不同的屏幕尺寸。