Flutter自适应布局插件flutter_adaptive_layout的使用

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

Flutter自适应布局插件flutter_adaptive_layout的使用

flutter_adaptive_layout 是一个方便实现基于屏幕尺寸的布局的小部件。

特性

  • 提取设备的屏幕大小。
  • 应用提供的(或覆盖的)屏幕大小断点。
  • 渲染根据提取的屏幕大小提供的布局变体。

示例

以下是不同设备上的布局效果:

iPhone 14 iPad Mini iPad Pro 12"

开始使用

安装库

flutter pub add flutter_adaptive_layout

导入库

import 'package:flutter_adaptive_layout/flutter_adaptive_layout.dart';

使用 AdaptiveLayout 构建器

Widget build(BuildContext context) {
  return AdaptiveLayout(
    smallBuilder: (context, child) => child!,
    mediumBuilder: (context, child) =>
        Center(
          child: Material(
            color: Colors.white,
            elevation: 4,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(16),
            ),
            child: ConstrainedBox(
              constraints: BoxConstraints.tight(const Size.square(400)),
              child: child,
            ),
          ),
        ),
    largeBuilder: (context, child) =>
        Center(
          child: Material(
            color: Colors.white,
            elevation: 4,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(16),
            ),
            child: ConstrainedBox(
              constraints: BoxConstraints.tight(const Size.square(600)),
              child: child,
            ),
          ),
        ),
    child: const MyHomePage(),
  );
}

使用方法

/example 目录下可以找到工作示例。默认断点设置为 400 用于小到中等屏幕,600 用于中到大屏幕。你也可以通过提供 smallBreakpointmediumBreakpoint 变量来自定义这些断点。

Widget build(BuildContext context) {
  return AdaptiveLayout(
    qualifier: BreakpointsQualifier(
      smallBreakpoint: 300,
      mediumBreakpoint: 700,
    ),
    smallBuilder: (context, child) => child!,
    mediumBuilder: (context, child) =>
        Center(
          child: Material(
            color: Colors.white,
            elevation: 4,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(16),
            ),
            child: ConstrainedBox(
              constraints: BoxConstraints.tight(const Size.square(400)),
              child: child,
            ),
          ),
        ),
    largeBuilder: (context, child) =>
        Center(
          child: Material(
            color: Colors.white,
            elevation: 4,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(16),
            ),
            child: ConstrainedBox(
              constraints: BoxConstraints.tight(const Size.square(600)),
              child: child,
            ),
          ),
        ),
    child: const MyHomePage(),
  );
}

你也可以通过实现自己的 ScreenSizeQualifier 来覆盖默认断点。

或者,你可以通过包裹你的小部件树来覆盖默认断点:

Widget build(BuildContext context) {
  return BreakpointsSetting(
    smallScreenBreakpoint: 200,
    mediumScreenBreakpoint: 500,
    child: MaterialApp(...),
  );
}

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_adaptive_layout/flutter_adaptive_layout.dart';
import 'package:flutter_adaptive_layout_example/home_page.dart';

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

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

  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Demo Home Page'),
        ),
        body: AdaptiveLayout(
          smallBuilder: (context, child) => child!,
          mediumBuilder: (context, child) =>
              Center(
                child: Material(
                  color: Colors.white,
                  elevation: 4,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(16),
                  ),
                  child: ConstrainedBox(
                    constraints: BoxConstraints.tight(const Size.square(400)),
                    child: child,
                  ),
                ),
              ),
          largeBuilder: (context, child) =>
              Center(
                child: Material(
                  color: Colors.white,
                  elevation: 4,
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.circular(16),
                  ),
                  child: ConstrainedBox(
                    constraints: BoxConstraints.tight(const Size.square(600)),
                    child: child,
                  ),
                ),
              ),
          child: const MyHomePage(),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,flutter_adaptive_layout 是一个用于在 Flutter 中实现自适应布局的插件。它提供了几个有用的布局小部件,使得在不同屏幕尺寸和方向上都能很好地展示你的应用界面。以下是一些基本的使用示例,展示如何在你的 Flutter 应用中使用 flutter_adaptive_layout

首先,确保你已经在 pubspec.yaml 文件中添加了依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_adaptive_layout: ^0.1.0  # 请检查最新版本号

然后运行 flutter pub get 来获取依赖。

示例代码

1. 导入包

在你的 Dart 文件中导入 flutter_adaptive_layout 包:

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

2. 使用 AdaptiveLayoutBuilder

AdaptiveLayoutBuilder 是该插件的核心组件,它允许你根据不同的屏幕尺寸和方向构建不同的布局。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Adaptive Layout Example'),
        ),
        body: AdaptiveLayoutBuilder(
          builder: (context, screenSize, screenType) {
            // screenSize 是一个 Size 对象,表示当前的屏幕尺寸
            // screenType 是一个 ScreenType 枚举,表示当前的屏幕类型(如手机、平板)

            if (screenType == ScreenType.mobile) {
              return _buildMobileLayout();
            } else if (screenType == ScreenType.tablet) {
              return _buildTabletLayout();
            } else {
              return _buildDesktopLayout();
            }
          },
        ),
      ),
    );
  }

  Widget _buildMobileLayout() {
    return Center(
      child: Text('This is a mobile layout'),
    );
  }

  Widget _buildTabletLayout() {
    return Row(
      children: <Widget>[
        Expanded(child: Text('Left side on tablet')),
        Expanded(child: Text('Right side on tablet')),
      ],
    );
  }

  Widget _buildDesktopLayout() {
    return Column(
      children: <Widget>[
        Expanded(child: Text('Top section on desktop')),
        Expanded(child: Text('Bottom section on desktop')),
      ],
    );
  }
}

3. 使用 AdaptiveScaffold

AdaptiveScaffold 提供了针对不同屏幕尺寸和方向的预定义布局,你可以在此基础上进行微调。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AdaptiveScaffold(
        appBar: AppBar(
          title: Text('Adaptive Scaffold Example'),
        ),
        body: AdaptiveBody(
          mobile: Center(child: Text('Mobile Body')),
          tablet: Row(
            children: <Widget>[
              Expanded(child: Text('Tablet Body Left')),
              Expanded(child: Text('Tablet Body Right')),
            ],
          ),
          desktop: Column(
            children: <Widget>[
              Expanded(child: Text('Desktop Body Top')),
              Expanded(child: Text('Desktop Body Bottom')),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {},
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

总结

以上代码展示了如何使用 flutter_adaptive_layout 插件来创建自适应布局。通过 AdaptiveLayoutBuilderAdaptiveScaffold,你可以轻松地为不同的屏幕尺寸和方向提供合适的布局。希望这些示例能帮助你更好地理解和使用 flutter_adaptive_layout

回到顶部