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

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

Responsive kit 是一个简化在 Flutter 中创建响应式 UI 的库。通过该库可以将设计文件中的特定屏幕尺寸转换为适应不同屏幕尺寸的响应式布局。

如上图所示,蓝色正方形和圆形周围的边距是恒定的,这些控件会根据黑色矩形进行调整。

目录


初始化

main.dart 文件中的 build 方法下初始化 SizeConfig.init

SizeConfig().init(context, height, width);
参数 描述
context main.dartinitBuildContext
height 设计文件中的框架高度,表示总像素数
width 设计文件中的框架宽度,表示总像素数

获取值

这些函数根据屏幕大小返回响应式的值,类型为 double

  • 高度
  • 宽度
  • 字体大小
  • 底部边距
SizeConfig().getMyDynamicHeight(heightInDesignFile, maxlimit: maxlimit);
SizeConfig().getMyDynamicFontSize(fontSizeInDesignFile, maxlimit: maxlimit);
SizeConfig().getMyDynamicWidth(widthInDesignFile, maxlimit: maxlimit);
SizeConfig().getBottomMarginforBigScreens();
参数 描述
heightInDesignFile 设计文件中根据设备设计师的高度因子
widthInDesignFile 设计文件中根据设备设计师的宽度因子
maxlimit 变量的最大限制值
fontSizeInDesignFile 设计文件中根据设备设计师的字体因子

在小部件中使用

Container(
  height: SizeConfig().getMyDynamicHeight(200),
  width: SizeConfig().getMyDynamicWidth(100),
  color: Colors.amber.shade100,
);

其他功能

变量 描述
horizontalBlock 屏幕宽度减去水平安全区域后分成100份,每份代表屏幕宽度的1/100
verticalBlock 屏幕高度分成100份,每份代表屏幕高度的1/100
screenHeight 使用 [MediaQuery] 获取屏幕高度
screenWidth 使用 [MediaQuery] 获取屏幕宽度
statusBarPadding 使用 [MediaQuery] 获取状态栏边距
SizeConfig.verticalBlock;
SizeConfig.horizontalBlock;
SizeConfig.screenHeight;
SizeConfig.screenWidth;
SizeConfig.statusBarPadding;

示例代码

以下是一个完整的示例项目,展示了如何使用 responsive_kit 库。

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

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Responsive Kit: 测试项目',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const MyHomePage(title: 'Responsive Kit: 测试项目'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);
  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 控制外层黑色方框的值,内部容器/圆形的值依赖于它
  double sliderValue = 1.0;
  // 设备的尺寸
  late double tempHeight;
  late double tempWidth;

  [@override](/user/override)
  Widget build(BuildContext context) {
    SizeConfig().init(context, MediaQuery.of(context).size.height, MediaQuery.of(context).size.width);

    // 获取设备的尺寸,以便示例项目使用
    tempHeight = SizeConfig.getMyDynamicHeight(MediaQuery.of(context).size.height) * 0.1 * (sliderValue);
    tempWidth = SizeConfig.getMyDynamicWidth(MediaQuery.of(context).size.width) * 0.1 * (sliderValue);

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Stack(
              alignment: AlignmentDirectional.center,
              children: [
                SizedBox(
                  height: SizeConfig.screenHeight * 0.8,
                ),
                Container(
                  height: tempHeight,
                  width: tempWidth,
                  color: Colors.black38,
                  child: Container(
                    margin: EdgeInsets.symmetric(
                      horizontal: SizeConfig.getMyDynamicWidth(20),
                      vertical: SizeConfig.getMyDynamicHeight(20),
                    ),
                    color: Colors.blue.shade400,
                    child: Container(
                      margin: EdgeInsets.symmetric(
                        horizontal: SizeConfig.getMyDynamicWidth(30),
                        vertical: SizeConfig.getMyDynamicHeight(30),
                      ),
                      decoration: const BoxDecoration(
                        color: Colors.white,
                        shape: BoxShape.circle,
                      ),
                    ),
                  ),
                ),
              ],
            ),
            Slider.adaptive(
              value: sliderValue,
              label: sliderValue.toString(),
              min: 1,
              max: 7,
              onChanged: (newValue) => setState(() => sliderValue = newValue),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


responsive_kit 是一个用于 Flutter 的响应式布局插件,旨在帮助开发者更容易地创建适应不同屏幕尺寸和方向的应用程序。它提供了多种工具和组件,可以简化响应式设计的实现。

安装

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

dependencies:
  flutter:
    sdk: flutter
  responsive_kit: ^1.0.0  # 请确保使用最新版本

然后运行 flutter pub get 来安装依赖。

基本用法

1. Responsive

Responsive 类是 responsive_kit 的核心类之一,用于根据屏幕尺寸和方向返回不同的值。

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Responsive Kit Example'),
      ),
      body: Center(
        child: Responsive(
          mobile: Text('Mobile View'),
          tablet: Text('Tablet View'),
          desktop: Text('Desktop View'),
        ),
      ),
    );
  }
}

在上面的例子中,Responsive 组件会根据当前设备的屏幕尺寸自动选择要显示的文本。

2. AdaptiveScreen

AdaptiveScreen 类允许你根据屏幕尺寸和方向来调整布局。

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Responsive Kit Example'),
      ),
      body: AdaptiveScreen(
        mobile: Container(color: Colors.red, child: Center(child: Text('Mobile View'))),
        tablet: Container(color: Colors.green, child: Center(child: Text('Tablet View'))),
        desktop: Container(color: Colors.blue, child: Center(child: Text('Desktop View'))),
      ),
    );
  }
}

AdaptiveScreen 组件会根据屏幕尺寸自动选择合适的布局。

3. ResponsiveBuilder

ResponsiveBuilder 提供了一个回调函数,可以根据屏幕尺寸和方向构建自定义布局。

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

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Responsive Kit Example'),
      ),
      body: ResponsiveBuilder(
        builder: (context, screenInfo) {
          if (screenInfo.screenType == ScreenType.MOBILE) {
            return Center(child: Text('Mobile View'));
          } else if (screenInfo.screenType == ScreenType.TABLET) {
            return Center(child: Text('Tablet View'));
          } else {
            return Center(child: Text('Desktop View'));
          }
        },
      ),
    );
  }
}

ResponsiveBuilder 提供一个 ScreenInfo 对象,包含了当前屏幕的尺寸和类型信息,你可以根据这些信息来构建自定义的布局。

其他功能

responsive_kit 还提供了其他一些功能,例如:

  • Breakpoint Management: 管理不同设备的断点(breakpoints),以便更容易地定义响应式布局。
  • Orientation Handling: 处理设备方向的变化,确保布局在横屏和竖屏模式下都能正确显示。

示例

以下是一个更完整的示例,展示了如何结合使用 responsive_kit 的不同功能:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Responsive Kit Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Responsive Kit Example'),
      ),
      body: ResponsiveBuilder(
        builder: (context, screenInfo) {
          if (screenInfo.screenType == ScreenType.MOBILE) {
            return Container(color: Colors.red, child: Center(child: Text('Mobile View')));
          } else if (screenInfo.screenType == ScreenType.TABLET) {
            return Container(color: Colors.green, child: Center(child: Text('Tablet View')));
          } else {
            return Container(color: Colors.blue, child: Center(child: Text('Desktop View')));
          }
        },
      ),
    );
  }
}
回到顶部