AppInventor2 中文社区
标题:
AppInventor2 过程不能在全局变量初始化时调用
[打印本页]
作者:
App Inventor 2
时间:
2 小时前
标题:
AppInventor2 过程不能在全局变量初始化时调用
(, 下载次数: 1)
上传
点击文件名下载附件
下载积分: 经验 1
(, 下载次数: 0)
上传
点击文件名下载附件
下载积分: 经验 1
什么报"该代码块不能被定义"
这条报错的英文原文是 "This block cannot be in a
definition",意思是这个块不能放在全局变量初始化
里,中文翻得不够准确。
全局变量的初始值在屏幕加载、组件还没初始化完的时
候就开始计算。所以 App Inventor
规定,初始值里只能放没有副作用的东西:常量、文本
、列表、字典、数学运算、组件属性读取等。会执行逻
辑的块都不行,包括调用过程、调用组件方法、修改组
件属性。原因有三个:
1. 过程里可能用到组件。
比如在过程里设置标签文字或调用方法,这时组件
可能还没准备好,运行就会出错。
2. 过程里可能读别的全局变量。 全局变量的初始化顺
序不确定,读到的可能是还没赋值的变量。
3. 编辑器检查不了过程内部。 它没法逐个判断过程里
有没有用到组件,只能把"调用过程"一律拦下。
MIT 上游源码也是这条规则:带返回值和不带返回值的
调用块都挂了同一项检查,代码和我们逐行相同。只有
一个例外:放在匿名过程块里面的调用不报错,因为匿
名过程只是被定义,加载时不会执行。
你那个项目的推荐写法
先把全局变量初始化为空字典,再到
Screen1.Initialize
事件里调用过程,把结果存进字典:
ai2-blocks
global data = {}
when Screen1.Initialize {
data = makeDict("key", myProc())
}
把 makeDict、myProc
换成你实际的块和过程名就行。Initialize
事件触发时组件都已准备好,也就不会报错了。
欢迎光临 AppInventor2 中文社区 (https://bbs.tsingfun.com/)
Powered by Discuz! X3.3