【发布时间】:2023-02-06 19:10:57
【问题描述】:
我正在尝试使用具有动态高度的 GridView.builder,具体取决于每行中的最大项目。 Wrap 不适用于此,因为它会同时呈现所有项目。构建器只渲染可见的项目。我不会为每一行手动计算 childAspectRatio。
有任何想法吗?
【问题讨论】:
标签: flutter
我正在尝试使用具有动态高度的 GridView.builder,具体取决于每行中的最大项目。 Wrap 不适用于此,因为它会同时呈现所有项目。构建器只渲染可见的项目。我不会为每一行手动计算 childAspectRatio。
有任何想法吗?
【问题讨论】:
标签: flutter
我做了一个 WrapBuilder 有点像 Wrap 但使用了一个生成器。但需要注意的是,您需要事先知道项目的宽度。如果没关系,您可以尝试使用此类:
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 itemsPerRow = max(1, constraints.maxWidth ~/ itemWidth);
return ListView.builder(
shrinkWrap: true,
controller: ScrollController(),
itemCount: (items.length / itemsPerRow).ceil(),
itemBuilder: (BuildContext context, int index) {
var rowItems = items.sublist(itemsPerRow * index,
min(itemsPerRow * (index + 1), items.length));
return Row(children: [
for (final item in rowItems)
SizedBox(
width: itemWidth,
child: itemBuilder(item))
]);
},
);
});
}
}
You might need to tweek it for your use case. In my case I have a list that is some data and the itemBuilder takes one of this data as parameter
【讨论】: