App Inventor 2 中文社区让每一个创意,成为真实的 App!

搜索

扫码访问移动社区 移动社区

关注我,精彩不错过! 公众号

扫码安装最新版AI伴侣 获取 App

Aia Store — App上架指南 .aia 源码一站式解决方案 发布日志 — AI2连接测试 — ai2Starter模拟器

AppInventor2离线版 — 中文教育版 — 接入DeepSeek VIP会员 享专有教程,免费赠送基础版*技术支持服务! AI2入门必读 — 中文文档 — AI2拓展 — IoT专题

查看: 1|回复: 0
打印 上一主题 下一主题

[经验分享] AppInventor2 过程不能在全局变量初始化时调用

  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 950 天

    [LV.10]以坛为家III

    1339

    主题

    2187

    帖子

    6万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    63611

    AI2中文网VIP弹球达人接水果达人撸猫达人

    跳转到指定楼层
    楼主
    发表于 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
      事件触发时组件都已准备好,也就不会报错了。
    App Inventor 2 中文网 - AI + 积木,让想法变成 App!Android/HarmonyOS/iOS 更新日志
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    © 2026 tsingfun.com, Inc.  沪ICP备2020034476号-1  沪公网安备31011702000040号

    GMT+8, 2026-10-15 20:53 , Processed in 0.017339 second(s), 33 queries .