Flutter屏幕适配插件responsivebility的使用

Flutter屏幕适配插件responsivebility的使用

简介

responsivebility 是一个用于在 Flutter 中创建响应式布局的简单工具库。通过使用该库,可以轻松地根据屏幕尺寸变化平滑过渡不同的值,并编写简单的逻辑来获取条件依赖于断点的属性。

功能

  • 在屏幕视口大小发生变化时,平滑过渡不同范围内的值。
  • 编写简单的逻辑以获取基于断点条件的属性。

开始使用

要开始使用 responsivebility,首先需要将它添加到你的 pubspec.yaml 文件中:

dependencies:
  responsivebility: ^版本号

然后运行 flutter pub get 来安装该库。

示例代码

以下是一个完整的示例,展示了如何使用 responsivebility 库来创建一个响应式布局的应用程序。

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  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) {
    final responsive = Responsivebility.of(
      context,
      range: ResponsiveRange({
        360: 24,
        500: 48,
        800: 65,
      }),
      breakpointSize: (size, visualDensity) {
        return size.width;
      },
    );

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        toolbarHeight: responsive.size(
          range: ResponsiveRange({
            360: kToolbarHeight,
            800: 100,
          }),
        ),
        leading: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            FlutterLogo(
              // 这将返回一个介于 24 和 48 之间的值。
              // 它会根据屏幕的最短宽度(默认情况下)进行线性插值。
              size: responsive.size(
                range: ResponsiveRange({
                  360: 24,
                  500: 48,
                }),
              ),
              // 根据条件更改属性
              style: responsive.valueOf<FlutterLogoStyle>(
                when: (size) {
                  if (size > 80) return FlutterLogoStyle.horizontal;
                  if (size > kToolbarHeight) return FlutterLogoStyle.stacked;
                  return FlutterLogoStyle.markOnly;
                },
              ),
            ),
          ],
        ),
        actions: [
          Padding(
            padding: const EdgeInsets.all(8.0),
            child: ActionButton(responsive: responsive),
          ),
        ],
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              '你已经按下了按钮多少次:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class ActionButton extends StatelessWidget {
  const ActionButton({
    super.key,
    required this.responsive,
  });

  final Responsivebility responsive;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Container(
          // 这将返回一个介于 24 和 48 之间的值。
          // 它会根据屏幕的最短宽度(默认情况下)进行线性插值。
          height: responsive.size(
            range: ResponsiveRange({
              360: 24,
              500: 48,
            }),
          ),
          width: responsive.size(
            range: ResponsiveRange({
              360: 24,
              500: 48,
            }),
          ),
          // 根据条件更改属性
          color: responsive.valueOf<Color>(
            when: (size) {
              if (size > 80) return Colors.red;
              if (size > kToolbarHeight) return Colors.orange;
              return Colors.blue;
            },
          ),
        ),
      ],
    );
  }
}

更多关于Flutter屏幕适配插件responsivebility的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕适配插件responsivebility的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


responsivebility 是一个用于 Flutter 的屏幕适配插件,旨在帮助开发者更轻松地处理不同屏幕尺寸和密度的布局问题。它基于 MediaQueryLayoutBuilder 来实现响应式设计,使得应用在不同设备上都能保持良好的用户体验。

安装

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

dependencies:
  flutter:
    sdk: flutter
  responsivebility: ^1.0.0  # 请使用最新版本

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

基本使用

responsivebility 提供了 ResponsiveWidgetResponsiveBuilder 两种方式来帮助你实现响应式布局。

1. 使用 ResponsiveWidget

ResponsiveWidget 是一个抽象的基类,你可以通过继承它来实现自定义的响应式布局。

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

class MyResponsiveWidget extends ResponsiveWidget {
  @override
  Widget build(BuildContext context, ResponsiveSize size) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Responsive Widget Example'),
      ),
      body: Center(
        child: Text(
          'Screen Width: ${size.width}',
          style: TextStyle(fontSize: size.width * 0.05),
        ),
      ),
    );
  }
}

void main() => runApp(MaterialApp(
  home: MyResponsiveWidget(),
));

在这个例子中,ResponsiveWidget 会根据屏幕的宽度和高度自动调整 Text 的字体大小。

2. 使用 ResponsiveBuilder

ResponsiveBuilder 是一个 Builder 模式的组件,它允许你在构建过程中获取屏幕的尺寸信息。

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

void main() => runApp(MaterialApp(
  home: ResponsiveBuilder(
    builder: (context, size) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Responsive Builder Example'),
        ),
        body: Center(
          child: Text(
            'Screen Width: ${size.width}',
            style: TextStyle(fontSize: size.width * 0.05),
          ),
        ),
      );
    },
  ),
));

在这个例子中,ResponsiveBuilder 会在构建时提供当前屏幕的尺寸信息,你可以根据这些信息来调整布局。

功能扩展

responsivebility 还提供了一些其他的功能,比如:

  • Breakpoints: 你可以定义不同屏幕尺寸的断点,以便在不同设备上应用不同的布局。
  • Orientation: 你可以根据设备的横竖屏状态来调整布局。

示例代码

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

void main() => runApp(MaterialApp(
  home: ResponsiveBuilder(
    builder: (context, size) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Responsive Builder Example'),
        ),
        body: Center(
          child: Text(
            'Screen Width: ${size.width}',
            style: TextStyle(fontSize: size.width * 0.05),
          ),
        ),
      );
    },
  ),
));
回到顶部