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的构建器。如果你需要为每个断点构建复杂的布局,可以使用这个。它在每次重建时都会提供BuildContextBreakpointBreakpointConfiguration

示例代码:

/* ... */

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将忽略断点的宽度和边距
);

查找当前断点

有一种简单的方法可以从BuildContextMediaQuery中查找当前断点。只需在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

1 回复

更多关于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

  1. 导入插件

在你的Dart文件中导入screen_breakpoints插件:

import 'package:screen_breakpoints/screen_breakpoints.dart';
  1. 定义断点

你可以根据自己的需求定义不同的断点。例如:

final ScreenBreakpoints breakpoints = ScreenBreakpoints(
  small: 600,
  medium: 960,
  large: 1200,
  xlarge: 1920,
);
  1. 使用断点

使用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.isSmallbreakpoints.isMediumbreakpoints.isLargebreakpoints.isXLarge方法分别用于检测当前屏幕尺寸是否在某个断点范围内。

这个示例展示了如何使用screen_breakpoints插件来检测屏幕尺寸并根据断点应用不同的布局。你可以根据自己的需求进一步扩展这个示例,例如使用不同的Widget或布局来适应不同的屏幕尺寸。

回到顶部