搜尋分類、套件與程式碼儲存庫

套件詳情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.

所屬分類

原始碼儲存庫

使用此套件的專案

暫無相關資料。