Flutter布局扩展插件flutter_extended_wrap的使用

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

Flutter布局扩展插件flutter_extended_wrap的使用

安装

pubspec.yaml 文件中添加以下依赖以从 pub.dev 导入该包:

dependencies:
  flutter_extended_wrap: ^0.0.3

导入

在 Dart 文件中导入该库:

import 'package:flutter_extended_wrap/flutter_extended_wrap.dart';

特性

ExtendedWrap 类允许你自动使默认的 Flutter Wrap 扩展到其父容器的大小,并且可以指定每行应包含多少个子组件。此外,你还可以自定义自由空间的放置位置,例如将子组件放置在 Wrap 的两侧,而自由空间位于中心。

类型

class ExtendedWrap {
  const ExtendedWrap({
    super.key,
    this.direction = Axis.horizontal,
    this.extendedWrapAlignment = ExtendedWrapAlignment.center,
    this.spacing = 0.0,
    this.runSpacing = 0.0,
    this.runAlignment = WrapAlignment.start,
    this.crossAxisAlignment = WrapCrossAlignment.start,
    this.textDirection,
    this.verticalDirection = VerticalDirection.down,
    this.clipBehavior = Clip.none,
    required this.childSizeInDirection,
    this.expandWrap = true,
    this.desiredChildrenPerRun,
    this.minFreeSpacePerRun = 0.0,
    required this.children,
  });
}

enum ExtendedWrapAlignment {
  start,
  end,
  center,
  spaceBetween,
  spaceAround,
  spaceEvenly,
  spaceCenter,
  spaceCenterOrAlignCenter,
  spaceCenterAndAround
}

使用

你可以在 /example 文件夹中找到如何使用不同配置的扩展 Wrap 的示例,该示例显示了以下内容:

Example

示例代码

以下是使用 flutter_extended_wrap 包的一个完整示例:

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_extended_wrap/flutter_extended_wrap.dart';

void main() => runApp(const App());

class CustomScrollBehavior extends MaterialScrollBehavior {
  // 覆盖行为方法和获取器,如拖动设备
  [@override](/user/override)
  Set<PointerDeviceKind> get dragDevices => <PointerDeviceKind>{
        PointerDeviceKind.touch,
        PointerDeviceKind.mouse,
      };
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
        scrollBehavior: CustomScrollBehavior(),
        home: Scaffold(body: _buildBody()));
  }

  Widget _buildBody() {
    final ScrollController controller = ScrollController(); // 不要这样做(不良实践)
    return Scrollbar(
      thumbVisibility: true,
      controller: controller,
      child: SingleChildScrollView(
        controller: controller,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: _buildWrapExamples(),
        ),
      ),
    );
  }

  List<Widget> _buildWrapExamples() {
    return <Widget>[
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceCenterOrAlignCenter,
        expandWrap: true,
        children: _createChildren(40, 40, Colors.blue, 8),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceCenterOrAlignCenter,
        expandWrap: true,
        children: _createChildren(40, 40, Colors.red, 7),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceCenter,
        minFreeSpacePerRun: 40,
        expandWrap: true,
        children: _createChildren(40, 40, Colors.green, 8),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceCenter,
        expandWrap: true,
        children: _createChildren(40, 40, Colors.purple, 13),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceCenter,
        expandWrap: true,
        desiredChildrenPerRun: 4,
        children: _createChildren(40, 40, Colors.orange, 8),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.start,
        expandWrap: true,
        desiredChildrenPerRun: 4,
        children: _createChildren(40, 40, Colors.blueGrey, 8),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.end,
        expandWrap: true,
        desiredChildrenPerRun: 6,
        children: _createChildren(40, 40, Colors.cyan, 7),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.center,
        expandWrap: true,
        children: _createChildren(40, 40, Colors.brown, 6),
      ),
      const SizedBox(height: 10),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceAround,
        expandWrap: true,
        desiredChildrenPerRun: 4,
        children: _createChildren(40, 40, Colors.pink, 8),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        runSpacing: 5,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceEvenly,
        expandWrap: true,
        desiredChildrenPerRun: 4,
        children: _createChildren(40, 40, Colors.lime, 8),
      ),
      ExtendedWrap(
        childSizeInDirection: 40,
        spacing: 10,
        runSpacing: 5,
        extendedWrapAlignment: ExtendedWrapAlignment.spaceBetween,
        expandWrap: true,
        desiredChildrenPerRun: 4,
        children: _createChildren(40, 40, Colors.deepOrange, 8),
      ),
    ];
  }

  List<Widget> _createChildren(double width, double height, MaterialColor initialColor, int elementCount) {
    return List<Widget>.generate(elementCount, (int index) {
      return Container(
        width: width,
        height: height,
        color: initialColor[100 * (index % 9 + 1)],
      );
    });
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用flutter_extended_wrap插件的一个示例。flutter_extended_wrap是一个扩展的Wrap布局插件,它允许你创建更加灵活和复杂的布局。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_extended_wrap: ^x.y.z  # 替换为最新的版本号

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

接下来,你可以在你的Dart文件中使用ExtendedWrap。以下是一个简单的示例,展示了如何使用ExtendedWrap来创建一个自适应的列表布局:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Extended Wrap Example'),
        ),
        body: Center(
          child: ExtendedWrapExample(),
        ),
      ),
    );
  }
}

class ExtendedWrapExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<String> items = List.generate(20, (index) => "Item $index");

    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: ExtendedWrap(
        spacing: 8.0,
        runSpacing: 8.0,
        crossAxisAlignment: WrapCrossAlignment.start,
        children: List.generate(
          items.length,
          (index) {
            return Container(
              decoration: BoxDecoration(
                border: Border.all(color: Colors.grey),
                borderRadius: BorderRadius.circular(8.0),
              ),
              padding: const EdgeInsets.all(12.0),
              child: Text(
                items[index],
                style: TextStyle(fontSize: 18),
              ),
            );
          },
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个包含20个项的列表,并使用ExtendedWrap来布局这些项。ExtendedWrap的参数如下:

  • spacing: 主轴方向(水平方向)上子项之间的间距。
  • runSpacing: 交叉轴方向(垂直方向)上子项之间的间距。
  • crossAxisAlignment: 子项在交叉轴方向上的对齐方式,这里设置为WrapCrossAlignment.start,表示子项在交叉轴方向的起始位置对齐。

你可以根据需要调整这些参数以及子项的样式。ExtendedWrap提供了比标准的Wrap更加灵活的布局方式,特别是在处理复杂布局时。

确保你已经安装了最新版本的flutter_extended_wrap,并根据你的需求进行适当的调整。

回到顶部