我想在大量的对象上使用Wrap。
我试图将所有对象映射到子对象,但这会导致严重的性能问题。
我希望有一些替代的方法来构建当前显示的小部件,但是使用Wrap的样式。
一些代码:
Wrap(
children: list.map(createCardFromData), // List contains 20'000 items
);发布于 2022-11-14 09:33:31
你需要一次装载这么多物品吗?无论如何,您可能都在使用滚动视图,因此用户最初只看到一小批项,而不是所有项,直到它们实际滚动更多。您要寻找的是延迟加载,可能与无限滚动之类的技术相结合。
尝试一个ListView (特别是ListView.builder),其中每个条目都包含一个Wrap小部件(例如,每10个条目),但是您可能希望尝试使用这个数字,直到您在性能和视觉吸引力之间找到平衡为止。
或者,您也可以编写自己的Wrap,延迟加载并重用其视图,这样它只能根据需要加载和显示几个子程序,而不是同时显示数千个子视图。
发布于 2022-11-14 10:58:08
如果您的项目是固定宽度的,您可以尝试如下所示:
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))
]);
},
);
});
}
}然后使用类似的
WrapBuilder(
itemWidth: 100, //example
items: list,
itemBuilder: createCardFromData);https://stackoverflow.com/questions/74429410
复制相似问题