Flutter:无法将 ListView 添加到示例应用程序

Posted

技术标签:

【中文标题】Flutter:无法将 ListView 添加到示例应用程序【英文标题】:Flutter: Can't add ListView to example app 【发布时间】:2020-08-09 18:28:38 【问题描述】:

我很难通过谷歌搜索来摆脱这种情况。我已经创建了基础教程附带的默认 Flutter 应用,现在我想在其中添加一个 ListView,如下所示:

  body: Center(
    // Center is a layout widget. It takes a single child and positions it
    // in the middle of the parent.
    child: Column(
      // Column is also a layout widget. It takes a list of children and
      // arranges them vertically. By default, it sizes itself to fit its
      // children horizontally, and tries to be as tall as its parent.
      //
      // Invoke "debug painting" (press "p" in the console, choose the
      // "Toggle Debug Paint" action from the Flutter Inspector in android
      // Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
      // to see the wireframe for each widget.
      //
      // Column has various properties to control how it sizes itself and
      // how it positions its children. Here we use mainAxisAlignment to
      // center the children vertically; the main axis here is the vertical
      // axis because Columns are vertical (the cross axis would be
      // horizontal).
      mainAxisAlignment: MainAxisAlignment.start,
      children: <Widget>[
        Text(
          'You have pushed the button this many times:',
        ),
        Text(
          '$_counter',
          style: Theme.of(context).textTheme.display1,
        ),
        ListView(
          padding: const EdgeInsets.all(8),
          children: <Widget>[
            Container(
              width: 50, // This changes nothing. 
              height: 50, // This changes nothing.
              child: const Center(child: Text('Text entry'))
            )
          ]
        ),
      ],
    ),
  ),

我唯一添加的是 ListView 小部件。

我收到的错误是这样的:

════════ Exception caught by rendering library ═════════════════════════════════════════════════════
RenderBox was not laid out: RenderRepaintBoundary#d4bf6 relayoutBoundary=up3 NEEDS-PAINT
'package:flutter/src/rendering/box.dart':
Failed assertion: line 1687 pos 12: 'hasSize'
The relevant error-causing widget was: 
  Column file:///Users/user/code/project/lib/main.dart:77:16
════════════════════════════════════════════════════════════════════════════════════════════════════

现在,我得出的结论是,这与 ListView 如何打包到其父容器中有关,也许渲染引擎不知道如何处理列表视图的大小,但我不知道能够找到有关如何实际修复它的信息。

【问题讨论】:

【参考方案1】:

这是因为默认情况下 ListView 想要扩展自身以填充可用空间。并导致您用无法自行扩展的列包装它。你有两个选择:

    首先是用 Expanded 小部件包裹您的 Listview。 Expanded 将为其子级占用所有剩余的可用空间。对于此选项,请使用以下代码:
Expanded(
  child: ListView(
    padding: const EdgeInsets.all(8),
    children: <Widget>[
      Container(
        width: 50, // This changes nothing.
        height: 50, // This changes nothing.
        child: const Center(child: Text('Text entry'))
      )
    ]
  ),
),
    第二个选项是将 ListView 的 shrinkWrap 属性设置为 true。这样做 ListView 不会自行扩展:
ListView(
  shrinkWrap: true,
  padding: const EdgeInsets.all(8),
  children: <Widget>[
    Container(
      width: 50, // This changes nothing.
      height: 50, // This changes nothing.
      child: const Center(child: Text('Text entry'))
    )
  ]
)

【讨论】:

很好的答案,谢谢!了解这两种方式特别好,因为我还没有真正决定是否以及如何在列表下方显示内容,所以我可能会选择选项 1,尽管选项 2 是我目前正在做的事情。【参考方案2】:

我认为问题出在您将ListView 放在列中。因此,您必须为您的 ListView 提供一个大小。 the answer to this question 提供了一个很好的代码示例来解决您的问题。

这个错误的实际原因是ColumnListView 都试图在垂直轴上展开。因此你需要限制 ListView 的高度。

【讨论】:

感谢您提供有关其背后理论的有趣信息。随着我的进步,它可能会被证明是有用的,但具体问题已由下面的 Çağrı BIYIK 解决。还在点赞。 :)【参考方案3】:

listView 有shrinkWrap 属性你可以试试:

ListView(
  shrinkWrap: true,
  padding: const EdgeInsets.all(8),
  children: <Widget>[
    Container(
      width: 50, // This changes nothing.
      height: 50, // This changes nothing.
      child: const Center(child: Text('Text entry'))
    )
  ]
)

【讨论】:

是的,正是我所需要的,直截了当!谢谢! :) 不过我不得不接受一个不同的答案,因为它更彻底,也很中肯。很抱歉,但欢迎来到 ***!

以上是关于Flutter:无法将 ListView 添加到示例应用程序的主要内容,如果未能解决你的问题,请参考以下文章

将 Text 小部件添加到其子项映射到 Flutter 的 ListView?

Flutter - 在无状态小部件中动态地将项目添加到 ListView

Flutter - 另一个Listview内的Listview.builder

Flutter 动画列表:有条件地添加 ListView 项

在 Flutter 中,当我在脚手架中添加 ListView 时出现问题

在 Flutter 中将 GestureDector 添加到 Listview.builder 卡的正确方法?