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

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

本README描述了该包。如果你将此包发布到pub.dev,则此README的内容会出现在你的包的首页上。

有关如何编写一个好的包README的信息,请参阅撰写包页面的指南。

有关开发包的一般信息,请参阅Dart指南创建库包和Flutter指南开发包和插件。

调整您的应用以适应所有屏幕尺寸并保持其美观性

此包将允许您的小部件根据屏幕大小的百分比调整其大小,或者以设计师屏幕的尺寸为参考,从而使您的应用在所有设备上看起来相似。

开始使用

此包由Daniele Cambi的文章启发。查看它以更好地理解此包的工作原理。

初始化

重要的是尽早初始化此包。但是,为了做到这一点,需要访问上下文和媒体查询,这在MaterialApp创建后可用。例如,我们将在main文件的material app的builder函数中初始化此包(见示例):

[@override](/user/override)
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: const MyHomePage(title: 'Flutter Demo Home Page'),
    builder: (context, child) {
      ResponsivityHelper(
        mediaQueryData: MediaQuery.of(context),
      );
      return child!;
    },
  );
}

默认情况下,包将使用屏幕的百分比进行工作。如果您希望保持设计与设计师屏幕的比例一致,可以设置该屏幕的大小如下:

[@override](/user/override)
Widget build(BuildContext context) {
  return MaterialApp(
    title: 'Flutter Demo',
    theme: ThemeData(
      primarySwatch: Colors.blue,
    ),
    home: const MyHomePage(title: 'Flutter Demo Home Page'),
    builder: (context, child) {
      ResponsivityHelper(
        mediaQueryData: MediaQuery.of(context),
        useDesignSizeAsReference: true,
        screenReferenceSizeParam: const Size(375, 812),
      );
      return child!;
    },
  );
}

您还可以通过参数设置字体大小策略:

fontSizeModeParam: FontSizeMode.referenceScreenValue,

[referenceScreenValue]:根据设计屏幕的大小调整字体大小。使用screenReferenceSize进行计算。

[screenPercent]:根据手机屏幕大小调整字体大小。每个点代表屏幕大小的0.1%,因此一个字体大小为16意味着屏幕高度的1.6%。

[androidSPStrategy]:以类似于安卓设备的方式调整字体大小。

[devicePixelRatio]:将字体大小乘以设备像素比。

使用方法

只需将每个大小乘以包计算出的因素。

例如,如果要创建一个高度为手机高度50%和宽度为21.5%的矩形,

Container(
  height: 50 * ResponsivityHelper.verticalUnit,
  width: 21.5 * ResponsivityHelper.horizontalUnit,
),
// 或者相同的代码

Container(
  height: 50.verticalPercent(),
  width: 21.5.horizontalPercent(),
)

对于文本,您可以使用以下方式设置字体大小:

Text(
  'Your text',
  style: TextStyle(
    fontSize: ResponsivityHelper.responsiveFontSize(17), // 在这里设置大小
    color: color,
    fontWeight: fontWeight,
  ),
);

或者直接使用ResponsiveText小部件:

ResponsiveText(
  'Your text',
  textAlign: TextAlign.center,
  fontSize: 20,
  color: Colors.black,
),

小部件

DeviceLayoutSelector

此小部件会根据设备的大小更改其子部件,允许您为不同的屏幕尺寸创建不同的视图,例如移动设备、平板电脑或桌面:

DeviceLayoutSelector(
  mobileBuilder: () {
    return const ResponsiveText(
      'Mobile design',
      textAlign: TextAlign.center,
      color: Colors.black,
    );
  },
  pcBuilder: () {
    return const ResponsiveText(
      'Desktop design',
      textAlign: TextAlign.center,
      color: Colors.black,
    );
  },
  tabletBuilder: () {
    return const ResponsiveText(
      'Tablet design:',
      textAlign: TextAlign.center,
      color: Colors.black,
    );
  },
),

OrientationLayout

此小部件会根据屏幕的方向(横屏或竖屏)更改其子部件:

OrientationLayout(
  portrait: () {
    return const ResponsiveText(
      'Mobile design portrait',
      textAlign: TextAlign.center,
      color: Colors.black,
    );
  },
  landscape: () {
    return const ResponsiveText(
      'Mobile design landscape',
      textAlign: TextAlign.center,
      color: Colors.black,
    );
  },
);

完整示例

以下是一个完整的示例代码,展示了如何使用flutter_responsivity_helper插件来实现响应式布局。

import 'package:flutter/material.dart';
import 'package:flutter_responsivity_helper/helpers/responsive_calculations.dart';
import 'package:flutter_responsivity_helper/widgets/device_detector_widget.dart';
import 'package:flutter_responsivity_helper/widgets/responsive_text.dart';

import 'my_painter.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: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
      builder: (context, child) {
        ResponsivityHelper(
          mediaQueryData: MediaQuery.of(context),
          useDesignSizeAsReference: true,
          screenReferenceSizeParam: const Size(375, 812),
          fontSizeModeParam: FontSizeMode.referenceScreenValue,
        );
        return child!;
      },
    );
  }
}

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> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomPaint(
        painter: MyPainter(),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Padding(
                padding: EdgeInsets.symmetric(
                  horizontal: 5.horizontalPercent(),
                ),
                child: DeviceLayoutSelector(
                  mobileBuilder: () {
                    return OrientationLayout(
                      portrait: () {
                        return const ResponsiveText(
                          'Mobile design portrait',
                          textAlign: TextAlign.center,
                          color: Colors.black,
                        );
                      },
                      landscape: () {
                        return const ResponsiveText(
                          'Mobile design landscape',
                          textAlign: TextAlign.center,
                          color: Colors.black,
                        );
                      },
                    );
                  },
                  pcBuilder: () {
                    return const ResponsiveText(
                      'Desktop design',
                      textAlign: TextAlign.center,
                      color: Colors.black,
                    );
                  },
                  tabletBuilder: () {
                    return const ResponsiveText(
                      'Tablet design:',
                      textAlign: TextAlign.center,
                      color: Colors.black,
                    );
                  },
                ),
              ),
              const ResponsiveText(
                'You have pushed the button this many times:',
                textAlign: TextAlign.center,
                fontSize: 20,
                color: Colors.black,
              ),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          ),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(
            Radius.circular(
              2.2.verticalPercent(),
              // ResponsivityHelper.horizontalUnit * 2,
            ),
          ),
        ),
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


flutter_responsivity_helper 是一个用于简化 Flutter 应用程序中响应式布局的插件。它提供了一些工具和实用程序,帮助开发者根据屏幕尺寸和设备类型来调整布局和样式。以下是如何使用 flutter_responsivity_helper 插件的指南。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  flutter_responsivity_helper: ^0.1.0  # 检查最新版本

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

2. 导入包

在你的 Dart 文件中导入 flutter_responsivity_helper

import 'package:flutter_responsivity_helper/flutter_responsivity_helper.dart';

3. 使用 ResponsiveBuilder

ResponsiveBuilder 是一个 widget,它可以根据屏幕尺寸和方向动态调整子 widget 的布局。你可以使用它来创建响应式布局。

ResponsiveBuilder(
  builder: (context, screenType, orientation) {
    if (screenType == ScreenType.mobile) {
      return MobileLayout();
    } else if (screenType == ScreenType.tablet) {
      return TabletLayout();
    } else {
      return DesktopLayout();
    }
  },
)

4. 使用 ResponsiveHelper

ResponsiveHelper 提供了一些实用方法来获取屏幕尺寸、宽度和高度等信息,并根据这些信息调整布局。

double width = ResponsiveHelper.width(context);
double height = ResponsiveHelper.height(context);

bool isMobile = ResponsiveHelper.isMobile(context);
bool isTablet = ResponsiveHelper.isTablet(context);
bool isDesktop = ResponsiveHelper.isDesktop(context);

5. 使用 ResponsiveValue

ResponsiveValue 可以根据屏幕类型返回不同的值。你可以将 ResponsiveValue 用于任何需要根据屏幕尺寸动态调整的地方。

final fontSize = ResponsiveValue<double>(
  context,
  mobile: 14.0,
  tablet: 18.0,
  desktop: 22.0,
).getValue();

Text(
  'Hello, World!',
  style: TextStyle(fontSize: fontSize),
);

6. 使用 ResponsivePadding

ResponsivePadding 可以根据屏幕尺寸动态调整 padding。

ResponsivePadding(
  mobile: EdgeInsets.all(10.0),
  tablet: EdgeInsets.all(20.0),
  desktop: EdgeInsets.all(30.0),
  child: Container(
    color: Colors.blue,
    child: Text('Responsive Padding'),
  ),
);

7. 使用 ResponsiveMargin

ResponsiveMargin 类似于 ResponsivePadding,但用于设置 margin。

ResponsiveMargin(
  mobile: EdgeInsets.all(10.0),
  tablet: EdgeInsets.all(20.0),
  desktop: EdgeInsets.all(30.0),
  child: Container(
    color: Colors.green,
    child: Text('Responsive Margin'),
  ),
);

8. 使用 ResponsiveText

ResponsiveText 可以根据屏幕尺寸动态调整文本样式。

ResponsiveText(
  'Responsive Text',
  mobile: TextStyle(fontSize: 14.0),
  tablet: TextStyle(fontSize: 18.0),
  desktop: TextStyle(fontSize: 22.0),
);

9. 使用 ResponsiveImage

ResponsiveImage 可以根据屏幕尺寸动态调整图片大小。

ResponsiveImage(
  'assets/images/my_image.png',
  mobile: Size(100.0, 100.0),
  tablet: Size(200.0, 200.0),
  desktop: Size(300.0, 300.0),
);

10. 使用 ResponsiveWidget

ResponsiveWidget 是一个通用的响应式 widget,允许你根据屏幕尺寸和方向构建不同的子 widget。

ResponsiveWidget(
  mobile: MobileLayout(),
  tablet: TabletLayout(),
  desktop: DesktopLayout(),
);
回到顶部