Flutter响应式UI插件my_responsive_ui的使用

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

Flutter响应式UI插件my_responsive_ui的使用

特性

  • 易于使用的扩展功能,如响应式的高度(.h)、宽度(.w)、字体大小(.sp)和相对尺寸(.r)。
  • 内置的间距工具(vs, hs)。
  • 带有最小/最大边界的尺寸安全计算。
  • 支持屏幕方向变化。
  • 防止内存泄漏。
  • 支持竖屏模式。
  • 基于屏幕尺寸的响应式布局。
  • 同时支持iOS和Android平台上的屏幕尺寸适配。

开始使用

在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  my_responsive_ui: [current version]

使用方法

步骤1:用ResponsiveInitializer包裹你的应用

void main() {
  runApp(
    MaterialApp(
      home: ResponsiveInitializer(
        baseHeight: 812, // 设计高度
        baseWidth: 375,  // 设计宽度
        child: MyApp(),
      ),
    ),
  );
}

步骤2:使用响应式扩展

Container(
  height: 200.h,  // 响应式高度
  width: 300.w,   // 响应式宽度
  padding: EdgeInsets.all(16.r),
  child: Text(
    'Hello',
    style: TextStyle(fontSize: 16.sp),
  ),
)

步骤3:使用间距工具

Column(
  children: [
    Text('First'),
    vs(20),  // 垂直间距
    Text('Second'),
  ],
)

完整示例

下面是一个完整的示例代码,展示了如何使用my_responsive_ui来创建一个响应式UI。

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

void main() {
  // 运行应用程序并从MyApp开始
  runApp(const MyApp());
}

/// 主应用小部件
///
/// 这个小部件是应用程序的入口点,并包含用于响应式UI初始化的[ResponsiveInitializer]小部件。
/// [ResponsiveInitializer]设置屏幕的基础高度和宽度以根据屏幕大小缩放UI组件。
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 返回带有响应式布局的MaterialApp
    return const MaterialApp(
      home: ResponsiveInitializer(
        baseHeight: 812, // 缩放的基础高度
        baseWidth: 375,  // 缩放的基础宽度
        child: HomePage(), // 主页小部件
      ),
    );
  }
}

/// 主页小部件,展示响应式UI
///
/// 这个小部件包含一个带有AppBar的Scaffold,一个具有响应式尺寸的容器,以及一些间距。UI会根据屏幕大小进行缩放,使用[ResponsiveUtil]类。
class HomePage extends StatelessWidget {
  const HomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('响应式UI演示', style: TextStyle(fontSize: 18.sp)),
        // 文本样式根据屏幕大小使用.sp进行缩放
      ),
      body: Padding(
        padding: EdgeInsets.all(16.r), // 使用.r进行响应式填充
        child: Column(
          children: [
            // 响应式容器,高度和宽度会缩放
            Container(
              height: isPortrait(context) ? 200.h : 150.h,
              // 高度根据方向改变
              width: double.infinity,
              // 占满整个宽度
              decoration: BoxDecoration(
                color: Colors.blue,
                borderRadius: BorderRadius.circular(12.r), // 使用.r进行响应式圆角
              ),
              child: Center(
                child: Text(
                  isPortrait(context) ? '竖屏模式' : '横屏模式',
                  style: TextStyle(
                      fontSize: 24.sp, // 使用.sp进行响应式字体大小
                      color: Colors.white),
                ),
              ),
            ),
            vs(20), // 使用.h进行垂直间距

            Center(
              child: Text(
                // 使用三元运算符检查平台
                // isIOS(context) 和 isAndroid(context) 函数用于检测设备平台
                isIOS(context)
                    ? '这是iOS设备' // 如果是iOS
                    : isAndroid(context) // 如果不是iOS,检查是否为Android
                        ? '这是Android设备' // 如果是Android
                        : '未知平台', // 如果既不是iOS也不是Android
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用my_responsive_ui插件来创建响应式UI的示例代码。请注意,my_responsive_ui是一个假设的插件名称,实际的Flutter生态系统中可能没有这个确切的插件。不过,我会基于常见的响应式UI设计原则给出一个示例,这些原则通常通过媒体查询(MediaQuery)和自定义布局逻辑来实现。

如果你正在寻找一个特定的插件,请确保它存在于pub.dev(Flutter的包管理器)上,并根据其文档进行调整。以下示例将展示如何在Flutter中实现基本的响应式设计,不使用具体的my_responsive_ui插件,但遵循类似的原则。

示例代码

首先,确保你的Flutter环境已经设置好,并且你已经创建了一个新的Flutter项目。

  1. 创建响应式布局辅助类(可选,但推荐)

你可以创建一个帮助类来处理屏幕尺寸和方向的逻辑。虽然这不是必须的,但它可以使代码更加清晰和模块化。

import 'package:flutter/material.dart';

class ResponsiveHelper {
  static double screenWidth(BuildContext context) {
    return MediaQuery.of(context).size.width;
  }

  static double screenHeight(BuildContext context) {
    return MediaQuery.of(context).size.height;
  }

  static bool isPortrait(BuildContext context) {
    return MediaQuery.of(context).orientation == Orientation.portrait;
  }

  static bool isLandscape(BuildContext context) {
    return MediaQuery.of(context).orientation == Orientation.landscape;
  }
}
  1. 使用LayoutBuilder和MediaQuery实现响应式UI

在你的主屏幕或小部件中使用LayoutBuilderMediaQuery来根据屏幕尺寸和方向调整布局。

import 'package:flutter/material.dart';
import 'responsive_helper.dart'; // 假设你将上面的类放在了这个文件中

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

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

class ResponsiveScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Responsive UI Demo'),
      ),
      body: LayoutBuilder(
        builder: (context, constraints) {
          if (ResponsiveHelper.isPortrait(context)) {
            return _buildPortraitLayout(constraints);
          } else {
            return _buildLandscapeLayout(constraints);
          }
        },
      ),
    );
  }

  Widget _buildPortraitLayout(BoxConstraints constraints) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
        Expanded(
          flex: 2,
          child: Image.network(
            'https://via.placeholder.com/600x400',
            fit: BoxFit.cover,
          ),
        ),
        Expanded(
          flex: 1,
          child: Center(
            child: Text(
              'This is a portrait layout',
              style: TextStyle(fontSize: 24),
            ),
          ),
        ),
      ],
    );
  }

  Widget _buildLandscapeLayout(BoxConstraints constraints) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.center,
      children: <Widget>[
        Expanded(
          flex: 1,
          child: Image.network(
            'https://via.placeholder.com/400x600',
            fit: BoxFit.cover,
          ),
        ),
        Expanded(
          flex: 2,
          child: Center(
            child: Text(
              'This is a landscape layout',
              style: TextStyle(fontSize: 24),
            ),
          ),
        ),
      ],
    );
  }
}

解释

  • ResponsiveHelper 类:这是一个帮助类,用于从MediaQuery中获取屏幕尺寸和方向信息。
  • LayoutBuilder:根据可用的屏幕大小(constraints)动态构建布局。
  • MediaQuery:用于获取当前设备的屏幕信息,如尺寸和方向。
  • 条件布局:根据屏幕方向(纵向或横向)返回不同的布局。

这种方法不使用特定的my_responsive_ui插件,但展示了如何在Flutter中实现基本的响应式设计。如果你确实有一个特定的响应式UI插件,你应该查阅其官方文档来了解如何使用它。通常,插件会提供一个更高级别的抽象,使响应式设计更加简单和直观。

回到顶部