搜索分类、插件与代码仓

插件详情v1.0.7

flexible_wrap

一个将子组件以灵活换行布局排列的控件,允许它们根据可用空间扩展,同时保持指定的布局属性。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
972
喜欢数
41
Pub 分数
160

安装插件

flutter pub add flexible_wrap

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个 Flutter 小部件,用于在灵活的换行布局中排列子组件,动态扩展以填充可用空间,同时保持布局约束。非常适合响应式设计,可无缝适应不同屏幕尺寸和方向。该小部件支持水平和垂直布局,具有可自定义的间距和对齐方式。特别适用于创建无需手动计算的流畅、自适应 UI。专为性能和简洁性而构建,可轻松集成到现有的 Flutter 项目中。

适合场景

  • 响应式表单布局
  • 动态网格显示
  • 自适应卡片布局
  • 流体内容容器
  • 跨平台UI设计

主要特点

  • 自动展开的子项
  • 灵活的方向控制
  • 可自定义间距
  • 响应式行为
  • 与 Flutter 的轻松集成

适合对象

  • 开发响应式 UI 的开发者
  • 需要自适应布局的设计师
  • 针对多个平台的项目
  • 动态内容的应用程序
  • 注重UI一致性的团队

使用建议

  • 可能需要在各种屏幕尺寸上进行测试
  • 大型子项数量带来的性能影响
  • 超出基本布局属性的自定义功能有限
  • 不适合固定大小的刚性网格

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

support-palestine-banner

FlexibleWrap

Test Demo deployment Pub Monthly Downloads Pub Publisher Pub Version Pub Likes


FlexibleWrap is a Flutter widget that provides an advanced wrap layout with flexible spacing and RTL support. It automatically distributes available space between items in a row, similar to Wrap widget but with additional features

Perfect for implementing uniform grid layouts like product cards, image galleries, or any UI that requires evenly-spaced wrapped items.

Showcase

showcase

Features

  • Dynamic Wrapping: Automatically wraps widgets onto the next line based on the available space.
  • Expanded Items: Expands the items to fill the available space on the row.
  • RTL Support: Provides support for right-to-left text direction, ensuring proper layout and alignment for RTL languages.
  • Customizable Spacing: Control both horizontal and vertical spacing between items
  • One Row Expansion: Option to expand items when they fit in a single row

Note: We currently support only items that have the same width; height direction is not supported yet

Benchmarks: GridView vs. FlexibleWrap

Feature GridView FlexibleWrap
Description A layout that arranges items in a grid format. It automatically distributes available space between items in a row.
Usage Efficient for uniform item sizes. Ideal for dynamic item sizes and wrapping.
Performance Better performance with a builder pattern. Currently does not support a builder; uses children instead.
Screen Recording GridView FlexibleWrap

Installation

Add this to your package's pubspec.yaml file:

dependencies:
  flexible_wrap: ^latest_version

Then run:

$ flutter pub get

Example Demo

Check out the live demo of FlexibleWrap at https://bixat.github.io/flexible_wrap/

Usage

First, import the package:

import 'package:flexible_wrap/flexible_wrap.dart';

Here's a basic example of how to use FlexibleWrap:


class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final spacing = 12.0;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: FlexibleWrap(
          spacing: spacing,
          runSpacing: spacing,
          textDirection: TextDirection.rtl,
          children: List.generate(20, (int index) {
            return Container(
              height: 100,
              width: 300,
              decoration: BoxDecoration(
                  color: Colors.blue, borderRadius: BorderRadius.circular(8.0)),
              child: const Center(
                child: ListTile(
                  title: Text(
                    "Lorem Ipsum is simply dummy text",
                    style: TextStyle(color: Colors.white),
                    overflow: TextOverflow.ellipsis,
                  ),
                  subtitle: Text(
                    "Lorem Ipsum has been the industry's standard",
                    style: TextStyle(color: Colors.white),
                    overflow: TextOverflow.ellipsis,
                  ),
                  leading: Icon(
                    Icons.insert_emoticon,
                    color: Colors.white,
                    size: 60.0,
                  ),
                  trailing: Icon(
                    Icons.favorite,
                    color: Colors.white,
                  ),
                ),
              ),
            );
          }).toList(),
        ),
      ),
    );
  }
}

Important Implementation Note

When using FlexibleWrap with dynamic dimensions (height, width, or item count), you should add a ValueKey to force widget rebuilds when these properties change:

FlexibleWrap(
  key: ValueKey('$itemHeight-$itemWidth-$itemCount'), // Force rebuild when dimensions change
  spacing: spacing,
  runSpacing: runSpacing,
  isOneRowExpanded: isOneRowExpanded,
  textDirection: isRTL ? TextDirection.rtl : TextDirection.ltr,
  children: [
    // Your widgets here
  ],
)

Why is this needed?

The ValueKey ensures that Flutter recognizes the widget as "changed" when dimensions are updated, forcing a complete rebuild of the render object. This is particularly important when:

  • Child widget dimensions change dynamically
  • The number of children changes
  • Layout properties are modified at runtime

Without the ValueKey, Flutter's widget tree optimization might prevent the render object from properly updating, leading to visual inconsistencies where dimension changes don't immediately reflect in the UI.

Customization

FlexibleWrap offers several customization options to tailor the layout to your needs:

Parameters
Parameter Type Default Description
children List<Widget> Required The widgets to display in the wrap layout
spacing double 0.0 Horizontal space between children
runSpacing double 0.0 Vertical space between runs
textDirection TextDirection null The text direction for RTL support
isOneRowExpanded bool false Whether to expand items when they fit in one row
Common Use Cases
  1. Grid Layout:
FlexibleWrap(
  spacing: 8.0,
  runSpacing: 8.0,
  children: items,
)
  1. RTL Support:
FlexibleWrap(
  spacing: 8.0,
  textDirection: TextDirection.rtl,
  children: items,
)

Contributing

We welcome contributions to FlexibleWrap! Here's how you can help:

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Please make sure to update tests and documentation as appropriate.

License

FlexibleWrap is licensed under the MIT License. See the LICENSE file for details.

所属分类

源码仓库

使用此插件的项目

暂无相关数据。