Как воспроизвести поведение CSS flex-grow space distribution в строке / столбце Flutter?

#css #flutter #flexbox #flutter-layout #flex-grow

#css #flutter #flexbox #flutter-layout #flex-grow

Вопрос:

У меня есть Row , который выглядит следующим образом:

 SizedBox(
    height: 64,
    child: Row(crossAxisAlignment: CrossAxisAlignment.stretch, children: [
        Expanded(
            child: Container(
            color: Colors.blue,
            child: Text("looooooooong", softWrap: false))),
        Expanded(
            child: Container(
            color: Colors.green, child: Text("short", softWrap: false)))
    ]));
  

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

Как вы можете видеть, текст в синем контейнере вырезается.

Построение того же самого с помощью CSS выглядит следующим образом:

 #container {
  width: 100px;
  height: 64px;
  display: flex;
  align-items: stretch;
}

#first {
  flex-grow: 1;
  background-color: blue;
}

#second {
  flex-grow: 1;
  background-color: green;
}  
 <div id="container">
  <div id="first">looooooooong</div>
  <div id="second">short</div>
</div>  

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

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

Как я должен добиться поведения CSS flex-box в Flutter?

Комментарии:

1. Это вряд ли будет возможно с Row по соображениям производительности. Возможно, вы захотите создать свой собственный пользовательский RenderBox

2. Точно ли вы хотите, чтобы контейнер переносил текст?

Ответ №1:

Если я правильно вас понял, вы хотите перестроить поведение CSS. Вы можете просто не использовать расширенные виджеты. Вот краткий автономный пример:

Демонстрация Flex Grow

 import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: SizedBox(
            height: 64,
            child: Row(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: <Widget>[
                Container(
                  color: Colors.blue,
                  child: Text('loooooooooooong'),
                ),
                Container(
                  color: Colors.green,
                  child: Text('short'),
                ),
              ],
            ),
          ),
        ),
      )
    );
  }
}
  

Ответ №2:

Расширенный виджет с Flex может работать на вас:

 import 'package:flutter/material.dart';
    
    void main() {
      return runApp(
        MaterialApp(
          home: Scaffold(
            body: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              children: [
                SizedBox(
                  height: 64.0,
                  child: Row(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      Expanded(
                        flex: 8,
                        child: Container(
                          color: Colors.blue,
                          child: const Text('loooooooooooong'),
                        ),
                      ),
                      Expanded(
                        flex: 2,
                        child: Container(
                          color: Colors.green,
                          child: const Text('short'),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      );
    }
  

Скриншот эмулятора iPhone, показывающий расширенный виджет Flutter с помощью Flex