Разрешить флаттер-столбцу занимать все доступное пространство в таком макете

У меня есть ListView.builder на моей странице, который оборачивает столбцы внутри него в соответствии с различными параметрами.

Мой код выглядит примерно так:

      ListView.builder(
  itemCount: sortedList.length,
  itemBuilder: (BuildContext context, int index) {
    Render Column 1,
    Render Column 2,
    Render Column 3
}

Мои столбцы выглядят примерно так:

      Column(
  mainAxisSize: MainAxisSize.min,
  children: [
   Child 1,
   Child 2,
  ]
)

Что я хочу ? Теперь, переходя к столбцу 3, я хочу, чтобы один дочерний элемент отображался вверху, а другой внизу экрана. Что-то вроде этого:

Как видите, я хочу, чтобы столбец 3 занимал все доступное пространство страницы, а затем он мог выровнять один из своих дочерних элементов по верхнему краю, а другой — по нижнему внутри себя . Я могу сделать это, просто добавив MainAxisAlignment.spaceBetween, но сейчас я не знаю, как разрешить этому столбцу занимать все доступное пространство внутри этого ListView.

Кто-нибудь может сказать мне, что мы можем здесь сделать? Заранее спасибо!

2 ответа

Чтобы заполнить оставшееся пространство, вам может потребоваться использовать CustomScroll, некоторые ленточные виджеты, которые вам подходят, и SliverFillRemaining , которое используется для заполнения оставшегося пространства прокрутки. Вы можете попробовать следующий пример на dartpad

      @override
Widget build(BuildContext context) {
return CustomScrollView(
  slivers: <Widget>[
    SliverList(
      delegate: SliverChildListDelegate(
        [
          Container(color: Colors.red, height: 50.0),
          Container(color: Colors.purple, height: 75.0),
        ],
      ),
    ),
    SliverFillRemaining(
      hasScrollBody: false,
      child: Container(
        color: Colors.green,
        child: const Padding(
          padding: EdgeInsets.all(8.0),
          child: Text('remaining'),
        ),
      ),
    ),
  ],
);
}

Если вы не полагаетесь на представление списка, вы можете использовать этот подход:

      return Scaffold(
    body: Builder(
  builder: (context) => SingleChildScrollView(
    child: ConstrainedBox(
      constraints: BoxConstraints(
        minHeight: MediaQuery.of(context).size.height,
      ),
      child: IntrinsicHeight(
        child: SafeArea(
          child: Column(
            children: [
              Column(
                children: [
                  Text('Column1'),
                ],
              ),
              Column(
                children: [
                  Text('Column2'),
                ],
              ),
              Expanded(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    Text('Column 3 child 1'),
                    Text('Column 3 child 2'),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    ),
  ),
));
Другие вопросы по тегам