【问题标题】:Why ListView.builder is suitable for large (or infinite) number of children and ListView.separated isn't?为什么 ListView.builder 适合大量(或无限)孩子而 ListView.separated 不适合?
【发布时间】:2022-01-25 17:08:43
【问题描述】:

我是 Flutter 新手,目前正在构建一个应用程序,其中包含一系列不同项目类型的列表。

由于项目的数量未知,并且由于其种类繁多,ListView.builder 构造函数在当时对我来说似乎是最佳选择,因为我可以为每个项目创建一个 Widget 并在 @987654323 上正确返回它们@以非常干净的方式。但是,我没有找到使用ListView.builder 实现分隔符的好方法,最终改为ListView.separated。更改很轻松,只需要传递一个新的separatorBuilder 参数。

问题是,Flutter 文档指出ListView.separated“适用于具有固定数量子项的列表视图”。

我的问题是:

  1. 为什么ListView.separated 不适合大量物品,而ListView.builder 适合?
  2. ListView.separated 对于大量项目是否存在性能问题?
  3. 是否有更好的方法来使用 ListView.builder 实现取决于项目类型的分隔符,而不需要我将 Widgets 包装在 Padding 或类似的东西中?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    回答您的问题:

    1。为什么 ListView.separated 不适合大量项目而 ListView.builder 适合?

    docs 也说:

    此构造函数适用于具有大量子项和分隔符子项的列表视图,因为仅对实际可见的子项调用构建器。

    因此,根据您阅读的页面和我在此处引用的页面,对于列表中的每个项目,构建器仅调用一次。不管列表的大小。它只提到,列表应该是固定大小的,而不是小尺寸。这是由于可能发生的范围异常。

    2。对于大量项目,ListView.separated 是否存在性能问题?

    如前所述,性能差别不大,因为调用构建器的时间相同。

    3。是否有更好的方法来使用 ListView.builder 实现取决于项目类型的分隔符,而不涉及我将小部件包装在 Padding 或类似的东西中?

    没有必要,因为ListView.separated 非常适合您的情况。

    【讨论】:

      【解决方案2】:

      要查看每个之间的区别,请访问ListView Class。

      当然,您可以使用ListView.builder() 创建表单,但我在尝试时发现了一些问题。

      1. 我无法将其放入任何 ListView() 或 Column(),如果除了 Form() 之外还有更多项目,则无法放入它们。
      2. 我什至无法在ListView.builder() 处添加一个按钮,即使在达到最后一个索引时使用条件放置它也是如此。因此,您必须使用textInputAction: TextInputAction.done 在onFieldSubmitted: 执行某种操作
      3. 获取我发现的字段数据的最佳方法是在调用 onSaved: 方法时将它们全部添加到 array 中,我认为这不是一个好方法(也许是)。

      话虽如此,这就是我曾经让它工作的原因:

      body: Form(
          key: _key,
          child: Container(
            child: ListView.builder(
              itemCount: 5,
              itemBuilder: (context, index) {
                return TextFormField(
                  textInputAction: TextInputAction.done,
                  validator: (text) {
                    if (text.isEmpty) {
                      return "The text is empty";
                    }
                  },
                  onFieldSubmitted: (text) {
                    _onSaved();
                  },
                  onSaved: (text) {
                    form.add(text);
                  },
                );             
              },
            ),
          ),
        ),
      
      void _onSaved() {
        if (_key.currentState.validate()) {
          _key.currentState.save();
          print(form);
        }
      }
      

      结果:

      I/flutter ( 7106): [fjjxjx, hxjxjcj, jxjxjfj, jfjfj, jxjxj]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多