Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗flPmLyWr 36 of 125 menu
◀ ▶

Виджет Wrap в Flutter

Виджет Row не переносит потомков: при нехватке ширины возникает переполнение. Виджет Wrap ведёт себя как ряд, но когда места не хватает, переносит хвост на новую «строчку» ниже. Удобно для облака тегов, фильтров и чипов.

Зазор между соседями в одной строке задаёт spacing. Расстояние между строками переноса задаёт runSpacing. Оба задаются в логических пикселях:

import 'package:flutter/material.dart'; void main() { runApp(const MaterialApp(home: HomePage())); } class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Padding( padding: const EdgeInsets.all(16), child: Wrap( spacing: 8, runSpacing: 8, children: const [ Chip(label: Text('Dart')), Chip(label: Text('Flutter')), Chip(label: Text('Layout')), Chip(label: Text('Widgets')), Chip(label: Text('Material')), ], ), ), ); } }

Направление переноса по умолчанию горизонтальное: строки идут сверху вниз. Выравнивание строк настраивают alignment и runAlignment аналогично главной и поперечной оси у Row, но для текущей и перенесённой линии:

Wrap( spacing: 12, runSpacing: 12, children: List.generate( 8, (i) => Container( padding: const EdgeInsets.symmetric( horizontal: 12, vertical: 6, ), color: Colors.teal.shade100, child: Text('Item $i'), ), ), )

Соберите такой Wrap:

SizedBox( width: 200, child: Wrap( spacing: 10, runSpacing: 10, children: [ for (var i = 1; i <= 8; i++) Text('Tag $i'), ], ), )

Часть подписей уходит на вторую строку, жёлто-чёрной полосы нет.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить