首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Wrap.builder类在ListView.builder

Wrap.builder类在ListView.builder
EN

Stack Overflow用户
提问于 2022-11-14 09:25:16
回答 2查看 63关注 0票数 1

我想在大量的对象上使用Wrap

我试图将所有对象映射到子对象,但这会导致严重的性能问题。

我希望有一些替代的方法来构建当前显示的小部件,但是使用Wrap的样式。

一些代码:

代码语言:javascript
运行
复制
Wrap(
  children: list.map(createCardFromData), // List contains 20'000 items
);
EN

回答 2

Stack Overflow用户

发布于 2022-11-14 09:33:31

你需要一次装载这么多物品吗?无论如何,您可能都在使用滚动视图,因此用户最初只看到一小批项,而不是所有项,直到它们实际滚动更多。您要寻找的是延迟加载,可能与无限滚动之类的技术相结合。

尝试一个ListView (特别是ListView.builder),其中每个条目都包含一个Wrap小部件(例如,每10个条目),但是您可能希望尝试使用这个数字,直到您在性能和视觉吸引力之间找到平衡为止。

或者,您也可以编写自己的Wrap,延迟加载并重用其视图,这样它只能根据需要加载和显示几个子程序,而不是同时显示数千个子视图。

票数 1
EN

Stack Overflow用户

发布于 2022-11-14 10:58:08

如果您的项目是固定宽度的,您可以尝试如下所示:

代码语言:javascript
运行
复制
import 'dart:math';
import 'package:flutter/cupertino.dart';

typedef ValueWidgetBuilder<T> = Widget Function(T value);

class WrapBuilder extends StatelessWidget {
  final double itemWidth;
  final List items;
  final ValueWidgetBuilder itemBuilder;

  const WrapBuilder(
      {Key? key,
      required this.itemWidth,
      required this.items,
      required this.itemBuilder})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return LayoutBuilder(builder: (context, constraints) {
      var cardsPerRow = max(1, constraints.maxWidth ~/ itemWidth);
      return ListView.builder(
            shrinkWrap: true,
            controller: ScrollController(),
            itemCount: (items.length / cardsPerRow).ceil(),
            itemBuilder: (BuildContext context, int index) {
              var rowItems = items.sublist(cardsPerRow * index,
                  min(cardsPerRow * (index + 1), items.length));
              return Row(children: [
                for (final item in rowItems)
                  SizedBox(
                      width: itemWidth,
                      child: itemBuilder(item))
              ]);
            },
          );
    });
  }
}

然后使用类似的

代码语言:javascript
运行
复制
WrapBuilder(
    itemWidth: 100, //example
    items: list,
    itemBuilder: createCardFromData);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74429410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档