App Inventor 2 DynamicComponents 拓展:动态创建AI2组件对象

« 返回首页

DynamicComponents 拓展

.aix 拓展下载(最新版 v2.3.0):

com.yusufcihan.DynamicComponents.aix

完全支持 App Inventor 2 的动态组件扩展。它基于 Java 的反射功能,因此只需键入类名称即可搜索类来创建组件。因此,它对特定组件的支持不受限制,因为它支持添加到 App Inventor 发行版中的每个组件!

🧩 代码块

代码块 描述
创建一个新的动态组件,它支持添加到当前 AI2 发行版的所有组件。 组件名称 参数可以是以下值:
组件的名称。
✅ 不需要添加现有组件。
❌ 只能创建组件。
现有组件块。
❌ 需要现有组件。
✅ 还可以创建扩展。
组件的完整类名。
✅ 不需要添加现有组件。
✅ 还可以创建扩展。

要了解组件的类名,请使用 GetName 代码块。
在给定容器(布局/画布)中创建一个新的动态组件并返回,不将其保存到已创建的组件列表中,因此它不会关联到 ID。请注意,你无法直接在 Screen 中创建组件,你需要事先在 Screen 中设置布局才能执行此操作。
将已创建组件的 ID 更改为新 ID。旧 ID 必须存在,新 ID 必须不存在。
替换 ID 时,它会循环遍历所有 ID,并替换每个包含旧 ID 的 ID!即使你要替换的 ID 是“Timmy”,但存在像“Timmy-truck”这样的 ID。再次说明,只有“Timmy-truck”中的“Timmy”会被替换,“-truck”部分将保持不变!
通过 JSON 字符串创建组件。请参阅Wiki,了解如何创建自己的模板。
从屏幕和组件列表中移除指定 ID 的组件。由于该组件已被删除,因此你可以再次使用该 ID。
从屏幕上移除一个组件。该组件无需由此扩展程序创建。但如果该组件是由此扩展程序动态创建的,则此代码块还会注销其 ID,以便后续创建的其他组件可以重用该 ID。
通过输入组件的属性名称来设置其属性。这可以称为 Setter 属性块。
它也可以用于设置仅在 Designer 中存在的属性。 它适用于常见类型。对于其他值,你应该使用 Any Component 块。
与 SetProperty 块相同,但用于使用 Dictionary 设置属性。
字典键等于属性名称,字典值等于属性值。
返回组件本身以供修改。 ID 必须是使用创建块添加的有效 ID。
ID --> 组件
返回组件的 ID。组件需要通过 Create 块创建。 否则将返回空字符串。也称为 GetComponent 块的反向操作。
组件 --> ID
根据组件的父级布局获取组件的位置。 索引从 1 开始。
根据组件的父级布局设置其位置。 索引从 1 开始。 输入 0(零)会将组件移动到末尾。
将组件移动到另一个布局。
通过输入组件的属性名称来获取其属性值。这可以称为 Getter 属性块。它也可以用于获取仅在 “设计视图” 中存在的属性。
获取有关指定组件的元数据。
获取有关指定组件事件的元数据。
获取有关指定组件的属性的元数据。
获取有关指定组件的方法(函数)的元数据。
返回最后一个组件的 ID。
将当前组件的所有已用 ID 作为 App Inventor [列表](../blocks/lists.html)返回。
生成一个随机的唯一 UUID。如果你不需要组件 ID,请在“创建”块中使用此块。
如果组件是由 Dynamic Components 扩展创建的,则返回“true”。否则返回“false”。
调用任意组件的方法。如果返回值对你不重要,请使用 执行但忽略结果 块。
返回扩展的版本。
返回扩展的版本名称。
使用 Schema 块创建 Schema 后触发。
组件创建后触发。

异步支持

此扩展程序可以根据你的选择以异步或同步方式创建组件。

如果你不想在创建大量组件时阻塞主应用,请在导入扩展程序后,前往设计器,在“UI”(异步)和“Main”(同步)之间进行选择。

案例

该demo实现了动态添加一行布局,布局中有一个标签和一个按钮,点击按钮响应事件,还可以动态删除一行布局,截图如下:

代码块如下:

源码下载:

dynamic_component_demo.aia

FAQ

  • 如何设置块的属性?

    有两种选择,效果一样:

    SetProperty

    Any Component

  • 如何删除所有组件?

    使用 for-each 循环:

  • 如何制作自己的架构模板?

    为扩展制作 JSON 模板:你可以访问动态组件存储库的 Wiki 部分,了解如何创建动态组件。

    创建模板 - DynamicComponents-AI2 Wiki

  • 扩展是异步工作还是同步工作?

    它是同步工作的。我在这篇文章中解释了为什么它同步工作。

    现在你可以使用 Thread 属性在异步或同步之间切换!

  • 应用程序需要花费大量时间来创建使用 图像 组件的组件,我该如何修复它?

    将现有的 Image.Picture 组件替换为 Image Utilities 组件。可以使用扩展来异步加载图像。

  • 创建组件需要多少时间?

    我创建了 10000 多个组件,并计算了需要多少秒才能完成创建。

    以下是基准测试结果。

基准测试结果

制作了一个测试应用程序,它创建了许多带循环的 Button 组件,并使用 Clock 计算执行时间。

测试1

平台:Companion / Kodular

测量方式:内置时钟组件

创建:具有默认属性的“按钮”组件

元件数量 创建时间(以秒为单位) 创建时间(以毫秒为单位)
100 0 sec 535 ms
200 1 sec 1387 ms
500 3 secs 3718 ms
1000 6 secs 6992 ms
2000 12 secs 12748 ms
5000 36 secs 36925 ms
10000 73 secs 73849 ms

测试2

平台:导出应用程序/Kodular

测量方式:内置时钟组件

创建:具有默认属性的“按钮”组件

元件数量 创建时间(以秒为单位) 创建时间(以毫秒为单位)
100 0 sec 593 ms
200 1 sec 1079 ms
500 2 secs 2427 ms
1000 6 secs 6023 ms
2000 12 secs 12009 ms
5000 25 secs 25092 ms
10000 64 secs 64520 ms

注意:

当然,当前运行的应用程序、当前可用内存、设备类型等都会影响执行时间。这只是一个大致的基准测试。

文档反馈