Переполнение нижней части listview.builder и ошибки с гибкими и расширенными виджетами

Я пытаюсь создать ListView, но я не могу сделать так, чтобы мой список попал в нижнюю часть, не переполняя его, способ, которым я обнаружил работу, заключался в установке высоты в контейнере, но когда я использую свое личное устройство, я получил большое белое пространство под моим списком.

Я уже пробовал гибкие и расширенные виджеты перед списком, но ни один из них не работал, всегда получаю одни и те же ошибки:

RenderFlex children have non-zero flex but incoming height constraints are unbounded

Vertical viewport was given unbounded height error

У вас есть какие-то решения для этого?

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0,
        backgroundColor: Colors.blueAccent,
        title: Padding(
          padding: EdgeInsets.only(left: 5.0),
          child: Text(
            user.name,
            style: TextStyle(fontSize: 30.0),
          ),
        ),
        actions: <Widget>[
          IconButton(
            alignment: Alignment.center,
            icon: Icon(Icons.forward),
            onPressed: () {},
          ),
        ],
      ),
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Container(
            color: Colors.blueAccent,
            child: Padding(
              padding: EdgeInsets.only(top: 30.0, left: 20.0, right: 20.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text("Conta",
                      style: TextStyle(fontSize: 17.0, color: Colors.white)),
                  Divider(color: Colors.blueAccent),
                  Text("${user.bankAccount} / ${user.agency}",
                      style: TextStyle(fontSize: 30.0, color: Colors.white)),
                  Padding(
                    padding: EdgeInsets.only(top: 30.0),
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: <Widget>[
                        Text("Saldo",
                            style:
                                TextStyle(fontSize: 17.0, color: Colors.white)),
                        Divider(color: Colors.blueAccent),
                        Text("${user.balance}",
                            style:
                                TextStyle(fontSize: 30.0, color: Colors.white)),
                        Divider(color: Colors.blueAccent),
                      ],
                    ),
                  ),
                ],
              ),
            ),
          ),
          Divider(color: Colors.white),
          Padding(
            padding: EdgeInsets.only(left: 20.0, right: 20.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text("Recentes",
                    style: TextStyle(fontSize: 20.0, color: Colors.black)),
                FutureBuilder(
                    future: getuserStatement(user.userId),
                    builder: getstatements,
                  ),
              ],
            ),
          ),
        ],
      ),
    );
  }

  Future getuserStatement(int id) {
    return api.getUserExtract(id);
  }

  Widget getstatements(BuildContext context, AsyncSnapshot snapshot) {
    return !snapshot.hasData
        ? Center(child: CircularProgressIndicator())
        : Container(
          height: 340,
          child: ListView.builder(
            itemCount: snapshot.data.length,
            itemBuilder: (context, index) {
              print(snapshot.data[index].title);
              return Card(
                elevation: 5,
                child: Column(
                  children: <Widget>[
                    Padding(
                      padding: EdgeInsets.only(top: 10.0, left: 10.0),
                      child: Row(
                        children: <Widget>[
                          Text(snapshot.data[index].title),
                          Expanded(
                            child: Align(
                              alignment: Alignment(0.90, 0.00),
                              child: Text(snapshot.data[index].date),
                            ),
                          ),
                        ],
                      ),
                    ),
                    Padding(
                      padding:
                          EdgeInsets.only(top: 20.0, bottom: 10.0, left: 10.0),
                      child: Row(
                        children: <Widget>[
                          Text(snapshot.data[index].desc),
                          Expanded(
                            child: Align(
                              alignment: Alignment(0.90, 0.00),
                              child:
                                  Text(snapshot.data[index].value.toString()),
                            ),
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              );
            },
          ),
        );
  }
}

person Murillo Pereira da Silva    schedule 21.01.2020    source источник
comment
Expanded работает только в том случае, если для или Column, в котором он находится, была задана фиксированная высота для работы. Ввод Column в ListView означает, что Column может иметь неограниченную высоту, поэтому Expanded не знает, насколько большой он может расшириться.   -  person Abion47    schedule 22.01.2020
comment
Итак, мне нужно установить фиксированную высоту для моего столбца внутри listView? а затем добавить расширенный виджет перед ListView?   -  person Murillo Pereira da Silva    schedule 22.01.2020


Ответы (1)


Решение:

потратив на это столько времени, я нашел решение:

Я видел, что в этой части моего кода я поместил еще один столбец внутри отступа:

Padding(
        padding: EdgeInsets.only(left: 20.0, right: 20.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text("Recentes",
                style: TextStyle(fontSize: 20.0, color: Colors.black)),
            Expanded(
              child: FutureBuilder(
                future: getuserStatement(user.userId),
                builder: getstatements,
              ),
            ),
          ],
        ),
      ),

Итак, я просто удалил столбец, оставил виджет текста и поместил развернутый виджет под отступом.

Padding(
        padding: EdgeInsets.only(left: 20.0, right: 20.0),
        child: Text("Recentes",
            style: TextStyle(fontSize: 20.0, color: Colors.black)),
      ),
      Expanded(
              child: FutureBuilder(
                future: getuserStatement(user.userId),
                builder: getstatements,
              ),
            ),

который создал мой список с максимальным пространством устройства, при этом мне не нужно устанавливать высоту с помощью контейнера или sizeBox.

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

person Murillo Pereira da Silva    schedule 22.01.2020
comment
На этом этапе вы можете полностью удалить Expanded. Если он не является потомком Row или Column, он ничего не делает. - person Abion47; 22.01.2020