- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这主要是一个概念性问题,因为我是 Dart 的新手,我想我不理解这里语言的语义。
在 IndexedWidgetBuilder 中,
Widget IndexedWidgetBuilder (
BuildContext context,
int index
)
究竟是谁在给索引赋值?
当这个“东西”被使用时,例如:
itemBuilder: (context, i) {
blablabla
},
“context”和“i”从未被初始化,它们神奇地拥有了一个值。谁在定义这个值,在哪里定义?
最佳答案
IndexedWidgetBuilder
是一个 typedef
,它定义了一个接受 BuildContext
和 int
的函数,并返回一个小部件
。
/// 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/
我有一个相当冗长的命令行程序,它需要用户输入参数,然后使用这些参数进行处理。我想做的是将程序拆分为交互式和非交互式。我试图这样做,并打算让非交互式程序“调用”交互式程序并使用结果(参数),基于这些参数
谁能解释为什么我们在构造函数的参数中使用大括号。 class Cars { String carName; bool isAuto; // create the constructor
我想知道是否有Dart函数,例如PHP的 strrev()。如果没有,您能否请向我展示任何源代码如何自行实现? 谢谢。 最佳答案 我还没有在API中找到一个新的Dart用户(截至今天下午)。但是,以任
我有一个组件,我想根据一个 bool 值绑定(bind)一个不同的 css 类。我的组件代码中有以下内容: bindCssClass(div, "open", this, "task.isOpen")
我一直在研究如何在dart中播放.wav文件,并且已经能够通过dart:html库中定义的AudioElement成功完成此操作。但是,我对使用dart:web_audio库感兴趣,并且遇到了所有这些
Dart 是否旨在实现许多与 Haxe 相同的功能,以便能够针对其他语言和运行时?它是语言和工具的既定目标还是已知目标? 最佳答案 不。Dart 专门针对 web 应用程序开发(更具体地说,客户端 w
我正在尝试让 dart 正常工作。作为编辑器,我想使用 emacs dart-mode。我有两个关于在没有 dart 编辑器的情况下使用 dart 的问题: 1) 我是否需要手动调用 dart2js,
我正在使用列表来创建墨水瓶按钮。我想将列表放在一个单独的 dart 文件中,并将该文件导入到我使用列表的文件中。我不知道如何导入列表。 https://pastebin.com/mf0kvsGu 我制
我正在编写一个 flutter 应用程序,它通过蓝牙 (FlutterBlue) 向设备发送命令。该设备控制一些 LED。通信总体上运行良好,但是:在用户界面上,我有一个控制光强度的 slider 。
我正在使用来自 Get started: command-line and server apps | Dart 的说明.运行 dart --version 时,我得到: Dart VM versio
var c 返回 3 但 10/7=1.4285,其余为 0.4285,operator % 有错误? void main() { var a = 10; var b = 7; var c
如文档中所述: The const keyword isn’t just for declaring constant variables. You can also use it to create
在 Dart 中,我如何最好地编写相当于(不可变/值/非对象) 的代码输出或引用参数 ? 例如在 C#-ish 中,我可能会编码: function void example() { int re
Dart 支持的多重继承机制有哪些? 最佳答案 不,Dart 不支持多重实现继承。 Dart 具有接口(interface),并且与大多数其他类似语言一样,它具有多个接口(interface)继承。
我正在寻找有关如何制作可以采用位置子参数的 web 组件的资源。就像是: {{value}} // this could be any uneditable element {{value}
使用polymer.dart 的Dart 应用程序的pubspec.yaml 文件如下所示(来自Polymer.dart Code Lab): name: polymer_and_dart descr
今天我决定开始学习 Dart 语言,我从 Tour 开始,那里有一个例子: // These work in a const string. const aConstNum = 0; const aC
我正在查找字符串类和其他一些资源,试图了解如何格式化字符串。首先,我试图将数字填充到字符串中,但不是精度。 例子: int a = 0, b = 5, c = 15, d = 46; String
我知道的大部分是Javascript。我相信“列表”是 Dart 最接近数组的东西,但它们在技术上是一样的吗?将它们视为数组是错误的吗?同样, map 会被视为对象吗?我意识到可能存在差异,但进行这种
现在,白色背景刺痛了我的眼睛,因为这是一个looong的黑夜。是否可以从 Dart 编辑器 (v 0.1) 更改主题(更改为更暗的主题)?选择背景颜色和语法高亮怎么样? 最佳答案 是的,这是可能的,我
我是一名优秀的程序员,十分优秀!