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

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

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

概述

flutter_responsive_scale 是一个用于适应屏幕和字体大小的Flutter插件。通过使用设备缩放,可以让UI在不同屏幕尺寸上合理布局。

示例

示例动画

特点

  • 响应式UI
  • 简单的UI工具
  • 易于使用
  • 支持响应查询选项(fontScale, yScale 和 width scale)

使用方法

添加依赖

请在安装前检查最新版本。如果新版本有问题,请使用旧版本。

dependencies:
  flutter:
    sdk: flutter
  # 添加 flutter_responsive_scale
  flutter_responsive_scale: ^{latest version}

导入库

在Dart代码中添加以下导入语句:

import 'package:flutter_responsive_scale/flutter_responsive_scale.dart';

属性

属性 类型 参数 描述
context.Scale(size) 函数 double required 设备设计中每个像素的比例。例如,160px屏幕上的一个像素等于320px屏幕上的两个像素。也是scaleX的别名。
context.fontScale(14) 函数 double required 相对于实际设备的字体大小设置。
context.scaleY() 函数 double required 参考设备配置 - 参考宽度(默认为414px,即iPhone XS Max)。参考高度(默认为896px,即iPhone XS Max),允许自动缩放字体大小(默认为true)。
ResponsiveScaleConfig height (double), width (double), allowFontScaling (bool - true) 设计草案的像素比例,垂直方向上。

初始化并根据系统字体大小调整

请在使用前设置设计草稿的缩放配置,包括设计草稿的宽度、高度以及是否允许字体缩放。

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ResponsiveScale(
      config: const ResponsiveScaleConfig(),
      child: MaterialApp(
        title: 'Responsive scale demo',
        theme: ThemeData.dark(),
        home: const ScaleTestPage(
          title: 'Hi , Flutter dev - ',
        ),
      ),
    );
  }
}

示例代码

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ResponsiveScale(
      config: const ResponsiveScaleConfig(),
      child: MaterialApp(
        title: 'Responsive scale demo',
        theme: ThemeData.dark(),
        home: const ScaleTestPage(
          title: 'Hi , Flutter dev - ',
        ),
      ),
    );
  }
}

class ScaleTestPage extends StatelessWidget {
  const ScaleTestPage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(title)),
      body: SingleChildScrollView(
        padding: EdgeInsets.symmetric(
          horizontal: context.scale(7),
        ),
        child: Center(
          child: Column(
            children: <Widget>[
              SizedBox(height: context.scale(16)),
              Text(
                'Designed at ${ResponsiveScale.of(context).width} x ${ResponsiveScale.of(context).height}',
                style: TextStyle(
                  fontSize: context.fontScale(16),
                ),
                textAlign: TextAlign.center,
              ),
              SizedBox(
                height: context.scale(16),
              ),
              Container(
                alignment: Alignment.topLeft,
                padding: EdgeInsets.only(
                  bottom: context.scaleY(10),
                ),
                child: Text(
                  'With scale box',
                  style: TextStyle(
                    fontSize: context.fontScale(14),
                  ),
                  textAlign: TextAlign.left,
                ),
              ),
              RenderBoxes(
                size: Size.square(
                  context.scale(100),
                ),
                color: Colors.red,
                label: const ["100dp", "100dp"],
              ),
              SizedBox(
                height: context.scale(16),
              ),
              Container(
                alignment: Alignment.topLeft,
                padding: EdgeInsets.only(
                  bottom: context.scaleY(10),
                ),
                child: Text(
                  'Without scale box',
                  style: TextStyle(
                    fontSize: context.fontScale(14),
                  ),
                  textAlign: TextAlign.left,
                ),
              ),
              const RenderBoxes(
                size: Size.square(
                  100,
                ),
                color: Colors.blue,
                label: ["100", "100"],
              ),
              SizedBox(
                height: context.scale(16),
              ),
              const Text(
                'The text font size is fixed at 24',
                style: TextStyle(
                  fontSize: 24,
                ),
                textAlign: TextAlign.center,
              ),
              SizedBox(
                height: context.scale(16),
              ),
              Text(
                'The text font size is flexible at 24',
                style: TextStyle(
                  fontSize: context.fontScale(24),
                ),
                textAlign: TextAlign.center,
              ),
              SizedBox(
                height: context.scale(48),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

class RenderBoxes extends StatelessWidget {
  const RenderBoxes({required this.size, this.color, required this.label, Key? key}) : super(key: key);

  final Size size;
  final Color? color;
  final List<String> label;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Row(
      children: List.generate(
        4,
        (_) => Container(
          width: size.width,
          height: size.height,
          color: color,
          child: Center(
            child: Text(
              label.join("\nx\n"),
              style: TextStyle(
                fontSize: context.fontScale(14),
              ),
              textAlign: TextAlign.center,
            ),
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter中使用flutter_responsive_scale插件来实现响应式布局的示例代码。这个插件可以帮助你根据屏幕尺寸和分辨率自动调整UI元素的尺寸。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_responsive_scale: ^x.x.x  # 请替换为最新版本号

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

接下来,在你的Flutter项目中使用flutter_responsive_scale。以下是一个简单的示例,展示了如何使用它来创建响应式UI:

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

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

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

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Responsive Scale Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用 ResponsiveSizer 来创建一个响应式大小的文本
            ResponsiveSizer(
              scales: [1.0, 1.2, 1.5],  // 分别在 [小, 中, 大] 屏幕尺寸上应用的缩放比例
              child: Text(
                'Hello, Flutter!',
                style: TextStyle(
                  fontSize: 24.rs,  // 使用 rs 单位来自动缩放字体大小
                ),
              ),
            ),
            SizedBox(height: 20.rs),  // 使用 rs 单位来自动缩放间距

            // 使用 ResponsiveGrid 来创建一个响应式网格布局
            ResponsiveGrid(
              columns: 2,  // 定义网格列数
              gap: 10.rs,  // 定义网格间距,使用 rs 单位
              children: <Widget>[
                Container(
                  color: Colors.blue,
                  child: Center(child: Text('Box 1')),
                ),
                Container(
                  color: Colors.green,
                  child: Center(child: Text('Box 2')),
                ),
                Container(
                  color: Colors.red,
                  child: Center(child: Text('Box 3')),
                ),
                Container(
                  color: Colors.yellow,
                  child: Center(child: Text('Box 4')),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们使用ResponsiveSizer来创建一个响应式大小的文本。fontSize: 24.rs表示字体大小会根据屏幕尺寸自动缩放。
  2. SizedBox(height: 20.rs)中的20.rs表示高度会根据屏幕尺寸自动缩放。
  3. ResponsiveGrid用于创建一个响应式网格布局,其中columns: 2表示网格有两列,gap: 10.rs表示网格之间的间距会根据屏幕尺寸自动缩放。

通过这些方式,你可以使用flutter_responsive_scale插件来实现响应式布局,使你的Flutter应用在不同设备和屏幕尺寸上都能有良好的显示效果。

回到顶部