gpt4 book ai didi

dart - IndexedWidgetBuilder,它是怎么知道索引的呢?

转载 作者:IT王子 更新时间:2023-10-29 06:44:14 25 4
gpt4 key购买 nike

这主要是一个概念性问题,因为我是 Dart 的新手,我想我不理解这里语言的语义。

在 IndexedWidgetBuilder 中,

Widget IndexedWidgetBuilder (
BuildContext context,
int index
)

究竟是谁在给索引赋值?

当这个“东西”被使用时,例如:

itemBuilder: (context, i) {
blablabla
},

“context”和“i”从未被初始化,它们神奇地拥有了一个值。谁在定义这个值,在哪里定义?

最佳答案

IndexedWidgetBuilder 是一个 typedef,它定义了一个接受 BuildContextint 的函数,并返回一个小部件

/// Signature for a function that creates a widget for a given index, e.g., in a
/// list.
///
/// Used by [ListView.builder] and other APIs that use lazily-generated widgets.
typedef Widget IndexedWidgetBuilder(BuildContext context, int index);

因此,在定义 itemBuilder 时,您为 Widget 提供了一个函数,当它想要构建一个项目时,它可以调用该函数。当 Widget 正在构建自身时,它将多次调用此函数来构建其每个子组件。简单地说,它可以用 i=0,然后 1,然后 2,等等调用这个函数。

如果您的 Widget 只有 3 个 child ,那么将其作为 List 传递会更容易,但如果您的 Widget 有 1000 个 child ,这将是低效的 - 这就是构建器的用武之地。Widget 将尝试只为它实际需要的子小部件调用 itemBuilder 函数,而不为任何不在屏幕顶部或底部的子小部件调用函数。

因此,为了回答您的问题,Widget 在调用它(通常多次)以构建其部分或全部子项时将上下文和 i 传递给您的 itemBuilder 函数。 i 代表第 i 个 child ,因此您的构建器函数知道它被要求构建哪个 child 。

编辑

IndexedWidgetBuilder 的 dartdoc 说它被 ListView.builder 使用。

ListView.builder 的 dartdoc 说

Providing a non-null itemCount improves the ability of the [ListView] to estimate the maximum scroll extent. The itemBuilder callback will be called only with indices greater than or equal to zero and less than itemCount. The itemBuilder should actually create the widget instances when called.

ListView.builder 命名构造函数构造一个 SliverChildBuilderDelegate,将 itemBuilder 作为构建器传入。

它在 SliverChildBuilderDelegate 的构建方法中使用,此处:

  @override
Widget build(BuildContext context, int index) {
assert(builder != null);
if (index < 0 || (childCount != null && index >= childCount))
return null;
Widget child = builder(context, index); // <- your callback is called
if (child == null)
return null;
if (addRepaintBoundaries)
child = new RepaintBoundary.wrap(child, index);
if (addAutomaticKeepAlives)
child = new AutomaticKeepAlive(child: child);
return child;
}

因此,index 来自SliverChildBuilderDelegate 的构建方法。您可以继续向后走,看看是谁调用的。

关于dart - IndexedWidgetBuilder,它是怎么知道索引的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50454512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com