Flutter自适应设计插件adaptive_design的使用

Flutter自适应设计插件adaptive_design的使用

Adaptive Design 是一个简化创建响应式和自适应用户界面的Flutter包。它结合了现有响应式包的优点,并解决了它们的局限性,为开发人员提供了易于使用的API。

特性

  • 响应式尺寸:根据屏幕大小缩放小部件和字体。
  • 断点管理:处理移动设备、平板电脑和桌面的不同布局。
  • 设备和方向检测:访问设备类型和方向信息。
  • 自适应小部件:构建适应不同屏幕尺寸的小部件。
  • 响应式文本:自动调整不同设备上的文本大小。
  • 可定制:设置自定义基准尺寸和断点。

安装

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

dependencies:
  adaptive_design: ^1.0.0

或者从Git仓库安装:

dependencies:
  adaptive_design:
    git:
      url: https://github.com/loqmanali/adaptive_design.git
      ref: main

然后运行:

flutter pub get

开始使用

1. 初始化

在你的 main.dart 文件中包裹你的应用:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  
  @override
  Widget build(BuildContext context) {
    return AdaptiveDesignProvider(
      context: context,
      mobileBreakpoint: 600,
      tabletBreakpoint: 900,
      child: const MaterialApp(
        title: 'Adaptive Design Demo',
        home: HomePage(),
      ),
    );
  }
}

2. 访问响应式工具

使用 AdaptiveDesignProvider.of(context) 来访问响应式工具:

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

class HomePage extends StatelessWidget {
  const HomePage({super.key});
  
  @override
  Widget build(BuildContext context) {
    final adaptiveDesign = AdaptiveDesignProvider.of(context);
    final size = adaptiveDesign.size;
    final deviceInfo = adaptiveDesign.deviceInfo;

    return Scaffold(
      appBar: AppBar(
        title: const ResponsiveText('Adaptive Design Demo'),
      ),
      body: Column(
        children: [
          Center(
            child: Container(
              width: size.scaleWidth(150),
              height: size.scaleHeight(100),
              color: Colors.blue,
              child: Center(
                child: ResponsiveText(
                  'This is a responsive container ${deviceInfo.isAndroid}',
                  style: const TextStyle(color: Colors.white),
                  textAlign: TextAlign.center,
                ),
              ),
            ),
          ),
          const AdaptiveLayoutExample(),
          const SizedBox(height: 20),
          ResponsiveText(
            'This is a responsive text ${adaptiveDesign.breakpointManager.mobileBreakpoint}',
          ),
          ResponsiveText('${size.scaleHeight(100)}'),
          ResponsiveText('${size.scaleWidth(100)}'),
          ResponsiveText('${size.scaleFont(100)}'),
          ResponsiveText('${size.wp(100)}'),
          ResponsiveText('${size.hp(100)}').paddingAllR(10),
          const SizedBox().heightR(10),
          const SizedBox().widthR(10),
          const SizedBox().sizeR(10, 10),
          ResponsiveText('${size.hp(100)}').paddingAllR(10),
        ],
      ),
    );
  }
}

3. 使用自适应小部件

AdaptiveContainer

基于设备类型构建不同的布局:

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

  @override
  Widget build(BuildContext context) {
    return AdaptiveContainer(
      mobileBuilder: (_) => const MobileLayout(),
      tabletBuilder: (_) => const TabletLayout(),
      desktopBuilder: (_) => const DesktopLayout(),
    );
  }
}
ResponsiveText

使用 ResponsiveText 构建响应式文本:

ResponsiveText(
  'Your text here',
  style: TextStyle(fontSize: 16),
  textAlign: TextAlign.center,
);

自定义

基准尺寸

设置自定义基准宽度和高度:

AdaptiveDesignProvider(
  context: context,
  baseWidth: 360.0,
  baseHeight: 640.0,
  child: const MyApp(),
);

断点

设置自定义断点:

AdaptiveDesignProvider(
  context: context,
  mobileBreakpoint: 480.0,
  tabletBreakpoint: 800.0,
  child: const MyApp(),
);

API 参考

AdaptiveDesignProvider

属性:

  • size: 提供响应式尺寸方法。
  • breakpointManager: 管理断点和设备类型。
  • deviceInfo: 提供设备和方向信息。

ResponsiveSize

方法:

  • wp(double percentage): 屏幕宽度的百分比。
  • hp(double percentage): 屏幕高度的百分比。
  • scaleWidth(double size): 基于基准宽度的缩放宽度。
  • scaleHeight(double size): 基于基准高度的缩放高度。
  • scaleFont(double size): 缩放后的字体大小。

BreakpointManager

属性:

  • deviceType: 返回 DeviceType.mobile, DeviceType.tablet, 或 DeviceType.desktop

DeviceInfo

属性:

  • orientation: 返回 Orientation.portraitOrientation.landscape
  • isPortrait: 如果是纵向模式返回 true
  • isLandscape: 如果是横向模式返回 true
  • isIOS: 如果平台是iOS则返回 true
  • isAndroid: 如果平台是Android则返回 true

示例

响应式按钮

ElevatedButton(
  onPressed: () {},
  child: ResponsiveText(
    'Click Me',
    style: TextStyle(fontSize: 18),
  ),
  style: ButtonStyle(
    padding: MaterialStateProperty.all(
      EdgeInsets.symmetric(
        horizontal: AdaptiveDesignProvider.of(context).size.scaleWidth(20),
        vertical: AdaptiveDesignProvider.of(context).size.scaleHeight(12),
      ),
    ),
  ),
);

响应式网格

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

class ResponsiveGridExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final deviceType = AdaptiveDesignProvider.of(context).breakpointManager.deviceType;
    int crossAxisCount = deviceType == DeviceType.mobile
        ? 2
        : deviceType == DeviceType.tablet
            ? 4
            : 6;

    return GridView.count(
      crossAxisCount: crossAxisCount,
      children: List.generate(20, (index) {
        return Card(
          child: Center(
            child: ResponsiveText('Item $index'),
          ),
        );
      }),
    );
  }
}

扩展

响应式上下文扩展

访问响应式尺寸方法:

final size = context.responsiveSize;

响应式边距

创建响应式的边距:

EdgeInsets padding = EdgeInsets.allR(context, 16);

响应式圆角

创建响应式的圆角:

BorderRadius radius = BorderRadius.circularR(context, 10);

响应式SizedBox扩展

创建响应式的SizedBox:

SizedBox box = SizedBox.widthR(context, 100);

响应式数字扩展

使用以下方法来响应式地缩放尺寸:

double width = 100.ws; // 缩放宽度
double height = 50.hs; // 缩放高度
double fontSize = 16.sp; // 缩放字体大小
double percentageWidth = 5.wp;

更多关于Flutter自适应设计插件adaptive_design的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自适应设计插件adaptive_design的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用adaptive_design插件的一个示例。这个插件允许你根据屏幕大小和方向进行自适应设计。尽管这个插件可能不是官方维护的(因为Flutter社区插件众多,且更新频繁),但大多数第三方插件的使用方法大同小异。以下示例假设存在一个名为adaptive_design的插件,并且它提供了基本的自适应功能。

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

dependencies:
  flutter:
    sdk: flutter
  adaptive_design: ^x.y.z  # 请替换为实际的版本号

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

接下来,在你的Flutter应用中,你可以使用adaptive_design插件提供的功能来实现自适应设计。以下是一个简单的示例,展示了如何根据屏幕大小和方向调整布局:

import 'package:flutter/material.dart';
import 'package:adaptive_design/adaptive_design.dart'; // 假设插件提供了这样的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return AdaptiveDesign(
      builder: (context, screenType) {
        return MaterialApp(
          title: 'Adaptive Design Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: screenType == ScreenType.small
              ? SmallScreenHome()
              : LargeScreenHome(),
        );
      },
    );
  }
}

class SmallScreenHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Small Screen'),
      ),
      body: Center(
        child: Text('This is a layout for small screens.'),
      ),
    );
  }
}

class LargeScreenHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Large Screen'),
      ),
      body: Row(
        children: <Widget>[
          Expanded(
            child: Container(
              color: Colors.blue.shade300,
              child: Center(child: Text('Left Panel')),
            ),
          ),
          VerticalDivider(),
          Expanded(
            child: Container(
              color: Colors.green.shade300,
              child: Center(child: Text('Right Panel')),
            ),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们使用了假设的AdaptiveDesign小部件,它根据屏幕大小和方向返回一个ScreenType枚举。然后,我们根据ScreenType来决定显示SmallScreenHome还是LargeScreenHome

请注意,实际的adaptive_design插件可能会有不同的API和用法。上述代码是基于假设的API设计的,你需要查阅插件的官方文档或源代码来获取准确的用法。如果插件提供了不同的方式来实现自适应设计(比如通过监听屏幕大小变化或方向变化),你可能需要调整代码以适应实际情况。

另外,Flutter本身也提供了强大的布局系统(如LayoutBuilderMediaQuery等),可以实现复杂的自适应设计,而无需依赖第三方插件。因此,在选择使用第三方插件之前,建议先考虑Flutter自带的解决方案是否满足需求。

回到顶部