AppInventor2 中文社区

标题: AppInventor2 过程不能在全局变量初始化时调用 [打印本页]

作者: App Inventor 2     时间: 2 小时前
标题: AppInventor2 过程不能在全局变量初始化时调用
(, 下载次数: 1) (, 下载次数: 0)

什么报"该代码块不能被定义"

  这条报错的英文原文是 "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