Я пытаюсь понять разницу между конструктором по умолчанию SliverList и именованным конструктором SliverList.builder. Кажется, оба используются для создания прокручиваемых списков внутри CustomScrollView, но я не уверен, когда использовать один вместо другого. Основываясь на моем предыдущем опыте работы с Flutter, я предположил, что функция-строитель создаст своих дочерних элементов по требованию, когда они станут видимыми, но я наблюдаю то же самое с SliverChildBuilderDelegate, поэтому я не понимаю, в чем именно разница.
CustomScrollView(
slivers: [
SliverList.builder(
itemCount: 50,
itemBuilder: (context, index) {
print(index);
return ListTile(
leading: const SizedBox.shrink(),
title: Text(index.toString()),
);
},
),
],
)
CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
print(index);
return ListTile(
leading: const SizedBox.shrink(),
title: Text(index.toString()),
);
},
childCount: 50,
),
),
],
)
В обоих случаях он печатает только видимые индексы.





Основное различие между SliverList и SliverList.builder во Flutter заключается в следующем:
Лень: SliverList.builder — более «ленивая» реализация, при которой дети создаются только тогда, когда они необходимы. Это более эффективно для списков с большим или бесконечным числом дочерних элементов, поскольку позволяет избежать предварительного создания всех дочерних элементов.
Itemcount: с помощью SliverList вам необходимо заранее указать полное значение itemCount, тогда как с помощью SliverList.builder вы можете указать значение itemCount, допускающее значение NULL, что может повысить точность показателей прокрутки, если точное количество элементов неизвестно.
Нулевые дочерние элементы: SliverList.builder позволяет функции itemBuilder возвращать значение null, что может быть полезно в определенных сценариях, но требует более тщательной обработки показателей прокрутки.
Сопоставление дочерних индексов: SliverList.builder позволяет предоставить функцию findChildIndexCallback, которая может быть полезна, если порядок дочерних элементов может измениться позднее.
Автоматическое сохранение активности, перерисовка границ, семантические индексы: SliverList.builder позволяет вам контролировать, добавляются ли эти функции автоматически к дочерним элементам, тогда как SliverList добавляет их всегда.
Таким образом, SliverList.builder больше подходит для больших или бесконечных списков, где более важны эффективность и гибкость, а SliverList больше подходит для небольших списков фиксированного размера, где полное количество элементов известно заранее.
SliverList: Читать здесь
SliverList принимает на вход список детей.SliverList используется, когда у вас есть фиксированное количество детей, которых вы хотите отобразить в списке. Вы указываете список детей непосредственно в качестве параметра Children виджета SliverList.Пример:
CustomScrollView(
slivers: <Widget>[
SliverList(
delegate: SliverChildListDelegate(
[
ListTile(title: Text('Item 1')),
ListTile(title: Text('Item 2')),
ListTile(title: Text('Item 3')),
],
),
),
],
),
SliverList.builder: Читать здесь
SliverList.builder принимает параметр делегата, в котором вы предоставляете экземпляр SliverChildBuilderDelegate.SliverList.builder используется, когда у вас большой или динамически меняющийся список товаров. Это позволяет вам создавать элементы списка по требованию, используя функцию компоновщика.Пример:
CustomScrollView(
slivers: <Widget>[
SliverList.builder(
itemCount: 3,
itemBuilder: (BuildContext context, int index) {
return ListTile(title: Text('Item $index'));
},
),
],
),
SliverList принимает список дочерних элементов напрямую, а SliverList.builder принимает делегат, который динамически создает дочерние элементы.SliverList.builder более эффективно использует память для длинных или динамических списков, поскольку он создает и поддерживает только те элементы, которые видны в данный момент.SliverList.builder позволяет легко создавать списки с большим или динамическим количеством элементов, а SliverList больше подходит для фиксированных списков.Кажется, они по сути одинаковы.
Если вы посмотрите на реализацию конструктора SliverList.builder, вы увидите, что он, по сути, передает вашу функцию itemBuilder в SliverChildBuilderDelegate:
// Constructor implementation:
SliverList.builder({
super.key,
required NullableIndexedWidgetBuilder itemBuilder,
ChildIndexGetter? findChildIndexCallback,
int? itemCount,
bool addAutomaticKeepAlives = true,
bool addRepaintBoundaries = true,
bool addSemanticIndexes = true,
}) : super(delegate: SliverChildBuilderDelegate( // the delegate is here
itemBuilder,
findChildIndexCallback: findChildIndexCallback,
childCount: itemCount,
addAutomaticKeepAlives: addAutomaticKeepAlives,
addRepaintBoundaries: addRepaintBoundaries,
addSemanticIndexes: addSemanticIndexes,
));
Я ценю ваш комментарий, но можете ли вы проверить мой вопрос, я использую
SliverChildBuilderDelegate, который не требует списка детей?