Flutter响应式布局插件bs_flutter_responsive的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter响应式布局插件bs_flutter_responsive的使用

开始使用

pubspec.yaml 文件中添加依赖:

dependencies:
  ...
  bs_flutter_responsive: any

响应式网格/网格系统

示例:example.dart

当创建一些Web应用程序时,网格系统非常重要,特别是为了创建响应式布局。此插件有助于解决这一问题。

要创建响应式布局,必须使用 BsRowBsCol 小部件,或者在Bootstrap中使用 class=“row” 和 class=“col-*”。

展示不同屏幕尺寸下的网格系统结果

网格系统超大屏结果 网格系统大屏结果 网格系统中屏结果 网格系统小屏结果

创建网格系统的行容器

BsRow(
  gutter: EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 5.0),
  children: [
    // 添加列
  ]
);

在行容器中添加列

BsRow(
  // ...
  children: [
    BsCol(
      decoration: BoxDecoration(
        border: Border.all(color: Colors.black),
      ),
      padding: EdgeInsets.all(20.0),
      sizes: ColScreen(sm: Col.col_12, lg: Col.col_6),
      child: Center(child: Text('col-sm-12 col-lg-6')),
    ),
    BsCol(
      decoration: BoxDecoration(
        border: Border.all(color: Colors.black),
      ),
      visibility: BsVisibility.hiddenMd,
      padding: EdgeInsets.all(20.0),
      sizes: ColScreen(sm: Col.col_12, lg: Col.col_6),
      child: Center(child: Text('col-sm-12 col-lg-6 col-hidden-md')),
    ),
    BsCol(
      decoration: BoxDecoration(border: Border.all(color: Colors.black)),
      padding: EdgeInsets.all(20.0),
      sizes: ColScreen(sm: Col.col_12, md: Col.col_12, lg: Col.col_6),
      order: ColOrder(md: 1),
      child: Center(child: Text('col-sm-12 col-md-12 col-md-6 col-order-lg-1')),
    ),
    BsCol(
      decoration: BoxDecoration(border: Border.all(color: Colors.black)),
      padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
      sizes: ColScreen(md: Col.col_6),
      child: BsRow(
        children: [
          BsCol(
            decoration: BoxDecoration(
              color: Colors.white,
              border: Border.all(color: Colors.black),
            ),
            padding: EdgeInsets.all(10.0),
            sizes: ColScreen(md: Col.col_4),
            child: Center(child: Text('Nested col-md-4')),
          ),
          BsCol(
            decoration: BoxDecoration(
              color: Colors.white,
              border: Border.all(color: Colors.black),
            ),
            padding: EdgeInsets.all(10.0),
            sizes: ColScreen(md: Col.col_4),
            offset: ColScreen(lg: Col.col_4),
            child: Center(child: Text('Nested col-md-4 col-offset-lg-4')),
          ),
        ],
      ),
    ),
  ]
)

注意事项

  • BsCol 中的 sizes 属性默认值为 Col.col_12 或 100% 的屏幕宽度。
  • 如果需要对列进行排序,可以使用 order 属性,并传递 BsScreen 类型的值。
  • 如果需要自定义列的偏移量,可以使用 offset 属性,并传递 BsScreen 类型的值。
  • BsVisibility.hiddenMd 会将组件隐藏在最大屏幕尺寸为中屏或小于768px的情况下,在更大屏幕上则显示。

完整示例代码

import 'package:bs_flutter_responsive/bs_flutter_responsive.dart';
import 'package:bs_flutter_utils/bs_flutter_utils.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('响应式网格'),
        ),
        body: BsRow(
          margin: EdgeInsets.only(bottom: 20.0),
          gutter: EdgeInsets.only(left: 10.0, right: 10.0, top: 5.0, bottom: 5.0),
          children: [
            BsCol(
              decoration: BoxDecoration(
                border: Border.all(color: Colors.black),
              ),
              padding: EdgeInsets.all(20.0),
              sizes: ColScreen(sm: Col.col_12, lg: Col.col_6),
              child: Center(child: Text('col-sm-12 col-lg-6')),
            ),
            BsCol(
              decoration: BoxDecoration(
                border: Border.all(color: Colors.black),
              ),
              visibility: BsVisibility.hiddenMd,
              padding: EdgeInsets.all(20.0),
              sizes: ColScreen(sm: Col.col_12, lg: Col.col_6),
              child: Center(child: Text('col-sm-12 col-lg-6 col-hidden-md')),
            ),
            BsCol(
              decoration: BoxDecoration(border: Border.all(color: Colors.black)),
              padding: EdgeInsets.all(20.0),
              sizes: ColScreen(sm: Col.col_12, md: Col.col_12, lg: Col.col_6),
              order: ColOrder(md: 1),
              child: Center(
                  child: Text('col-sm-12 col-md-12 col-md-6 col-order-lg-1')),
            ),
            BsCol(
              decoration: BoxDecoration(border: Border.all(color: Colors.black)),
              padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
              sizes: ColScreen(md: Col.col_6),
              child: BsRow(
                children: [
                  BsCol(
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border.all(color: Colors.black),
                    ),
                    padding: EdgeInsets.all(10.0),
                    sizes: ColScreen(md: Col.col_4),
                    child: Center(child: Text('Nested col-md-4')),
                  ),
                  BsCol(
                    decoration: BoxDecoration(
                      color: Colors.white,
                      border: Border.all(color: Colors.black),
                    ),
                    padding: EdgeInsets.all(10.0),
                    sizes: ColScreen(md: Col.col_4),
                    offset: ColScreen(lg: Col.col_4),
                    child: Center(child: Text('Nested col-md-4 col-offset-lg-4')),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter响应式布局插件bs_flutter_responsive的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter响应式布局插件bs_flutter_responsive的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,bs_flutter_responsive 是一个用于 Flutter 的响应式布局插件,它可以帮助开发者更轻松地创建适应不同屏幕尺寸和方向的界面。以下是一个简单的代码示例,展示了如何使用 bs_flutter_responsive 来实现响应式布局。

首先,你需要在你的 pubspec.yaml 文件中添加 bs_flutter_responsive 依赖:

dependencies:
  flutter:
    sdk: flutter
  bs_flutter_responsive: ^最新版本号 # 请替换为实际的最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,在你的 Flutter 应用中使用 bs_flutter_responsive。以下是一个示例代码:

import 'package:flutter/material.dart';
import 'package:bs_flutter_responsive/bs_flutter_responsive.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化响应式配置
    return ResponsiveWrapper.builder(
      BouncingScrollWrapper.builder(
        context,
        // 设置断点
        breakpoints: [
          ResponsiveBreakpoint.xs,
          ResponsiveBreakpoint.sm,
          ResponsiveBreakpoint.md,
          ResponsiveBreakpoint.lg,
          ResponsiveBreakpoint.xl,
        ],
        // 响应式布局构建器
        builder: (context, width, height, breakpoint) {
          return MaterialApp(
            title: 'Flutter Demo',
            theme: ThemeData(
              primarySwatch: Colors.blue,
            ),
            home: Scaffold(
              appBar: AppBar(
                title: Text('Responsive Layout Demo'),
              ),
              body: Center(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    // 根据断点调整文本大小
                    Text(
                      'Hello, Responsive Layout!',
                      style: TextStyle(
                        fontSize: breakpoint == ResponsiveBreakpoint.xs
                            ? 16
                            : breakpoint == ResponsiveBreakpoint.sm ||
                                    breakpoint == ResponsiveBreakpoint.md
                                ? 20
                                : 24,
                      ),
                    ),
                    SizedBox(height: 20),
                    // 根据断点调整布局
                    LayoutBuilder(
                      builder: (context, constraints) {
                        if (constraints.maxWidth < 600) {
                          // 小屏幕布局
                          return Column(
                            children: [
                              ElevatedButton(
                                onPressed: () {},
                                child: Text('Button 1'),
                              ),
                              SizedBox(height: 10),
                              ElevatedButton(
                                onPressed: () {},
                                child: Text('Button 2'),
                              ),
                            ],
                          );
                        } else {
                          // 大屏幕布局
                          return Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              ElevatedButton(
                                onPressed: () {},
                                child: Text('Button 1'),
                              ),
                              SizedBox(width: 20),
                              ElevatedButton(
                                onPressed: () {},
                                child: Text('Button 2'),
                              ),
                            ],
                          );
                        }
                      },
                    ),
                  ],
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

在这个示例中,我们使用了 ResponsiveWrapper.builder 来包裹整个应用,并设置了断点。builder 参数接收一个函数,该函数根据当前的屏幕宽度和断点返回相应的布局。我们还使用了 LayoutBuilder 来根据屏幕尺寸动态调整按钮的布局。

请注意,bs_flutter_responsive 插件的具体用法和API可能会随着版本的更新而变化,因此建议查阅最新的官方文档以获取最准确的信息。

回到顶部