Flutter wrap не является дочерним элементом строки

#flutter #flutter-layout #flutter-web #flutter-row

#флаттер #flutter-layout #flutter-web #flutter-строка

Вопрос:

У меня есть одна строка с двумя дочерними элементами. Первый — это перенос, а второй — другая строка, например:

 Row(
  mainAxisAlignment: MainAxisAlignment.spaceBetweeen,
  children: [
    Wrap(<two children in here>),
    Row(<2 or 3 children in here>)
]
 

Я ожидал, что когда экран будет меньше, дочерние элементы Wrap будут накладываться друг на друга слева, а дочерние элементы Row останутся в строке справа.

На самом деле происходит переполнение дочерней строки вправо, а дочерние элементы Wrap никогда не накладываются друг на друга.

Цель состоит в том, чтобы избежать переполнения, но не «разбивать» дочернюю строку. Дочерний элемент Wrap — это то, что я хочу «сломать», когда размер окна слишком мал, чтобы иметь как перенос, так и дочернюю строку в родительской строке.

PS — это для Интернета, а не для мобильных устройств. Я не думаю, что это имеет значение. введите описание изображения здесь

Ответ №1:

Оберните Wrap виджет в Expanded :

 Row(
  children: [
    Expanded(
      child: Wrap(
        spacing: 20,
        runSpacing: 20,
        children: [
          Container(width: 100, height: 50, color: Colors.green),
          Container(width: 100, height: 50, color: Colors.green),
          Container(width: 100, height: 50, color: Colors.green),
        ],
      ),
    ),
    Row(
      children: [
        Container(width: 100, height: 50, color: Colors.red),
        SizedBox(width: 30),
        Container(width: 100, height: 50, color: Colors.red),
      ],
    ),
  ],
)
 

введите описание изображения здесь

Ответ №2:

Вы можете добиться этого, встроив свой дочерний Row элемент в IntrinsicWidth виджет.

введите описание изображения здесь

В этом примере я также встроил родительский Row элемент в IntrinsicHeight виджет Row , чтобы дочерние элементы растягивались в соответствии с Wrap .

Полный исходный код

 import 'package:flutter/material.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      home: HomePage(),
    ),
  );
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: IntrinsicHeight(
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Flexible(
              child: Wrap(
                children: [
                  Card(
                    child: Container(
                      color: Colors.blue.shade200,
                      padding:
                          EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0),
                      child: Text('Text 1'),
                    ),
                  ),
                  Card(
                    child: Container(
                      color: Colors.blue.shade200,
                      padding:
                          EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0),
                      child: Text('Text 2'),
                    ),
                  ),
                ],
              ),
            ),
            IntrinsicWidth(
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  Card(
                    child: Container(
                      color: Colors.green.shade200,
                      padding:
                          EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0),
                      child: Text('Text A'),
                    ),
                  ),
                  Card(
                    child: Container(
                      color: Colors.green.shade200,
                      padding:
                          EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0),
                      child: Text('Text B'),
                    ),
                  ),
                  Card(
                    child: Container(
                      color: Colors.green.shade200,
                      padding:
                          EdgeInsets.symmetric(horizontal: 24.0, vertical: 8.0),
                      child: Text('Text C'),
                    ),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
 

Ответ №3:

Я обернул дочерний элемент Wrap() в Expanded(), как предложил Кирилл Бубочкин. Обертывание дочернего элемента Wrap() в Flexible() также имеет тот же эффект.