App Inventor 2 多屏幕变量传递教程

解答高频问题:不同Screen之间变量是否互通?如何传递数据?

一、核心结论(先看这里)

⚠️ App Inventor 2 中,不同Screen之间的全局变量不互通!
每个Screen是独立的,各自有自己的全局变量。Screen1的全局变量在Screen2中无法直接访问。 解决方案汇总:
方案适用场景难度
启动值(StartValue)跳转时传少量数据
本地微数据库(TinyDB)传任意数据,持久化
网络微数据库多设备共享数据⭐⭐
单Screen设计根本解决方案⭐⭐⭐

二、方案一:启动值(StartValue)

2.1 原理

跳转到新Screen时,可以携带一个字符串参数;新Screen通过”获取启动值”读取。

2.2 发送方(Screen1)

// 跳转到Screen2,并传递数据
当 按钮_跳转.被点击 时
  // 传递单个值
  调用 打开另一屏幕并传值("Screen2", "Hello from Screen1")
  
  // 传递多个值(用JSON格式)
  初始化局部变量 数据 = 调用 字典.字典转JSON(
    创建字典(["用户名", "张三"], ["分数", 95], ["等级", "A"])
  )
  调用 打开另一屏幕并传值("Screen2", 数据)

2.3 接收方(Screen2)

// Screen2初始化时读取启动值
当 Screen2.初始化 时
  初始化局部变量 启动值 = 调用 获取启动值()
  
  // 如果是JSON格式,解析为字典
  如果 启动值 ≠ "" 则
    初始化局部变量 数据字典 = 调用 字典.JSON转字典(启动值)
    初始化局部变量 用户名 = 获取键的值(数据字典, "用户名", "")
    初始化局部变量 分数 = 获取键的值(数据字典, "分数", 0)
    
    设置 标签_用户名.文本 = 用户名
    设置 标签_分数.文本 = 分数

2.4 “获取启动值”积木在哪里?

控制代码块分类中,找到”打开另一屏幕并传值”和”获取启动值”。

2.5 Screen2返回数据给Screen1

// Screen2关闭时返回数据
当 按钮_返回.被点击 时
  调用 关闭屏幕并返回值("操作完成,结果=100")

// Screen1接收返回值
当 Screen1.获得其他屏幕的值 时(屏幕名称, 返回值)
  设置 标签_返回值.文本 = 合并字符串("Screen2返回:", 返回值)

三、方案二:本地微数据库(TinyDB)推荐

3.1 原理

TinyDB存储在手机本地,所有Screen共享同一个TinyDB,是最简单可靠的跨Screen数据共享方案。

3.2 Screen1写入数据

// Screen1:保存数据到TinyDB
当 按钮_保存并跳转.被点击 时
  // 保存数据
  调用 微数据库1.存储值("current_user", 文本输入框_用户名.文本)
  调用 微数据库1.存储值("user_score", 滑动条_分数.滑块位置)
  调用 微数据库1.存储值("settings", 调用 字典.字典转JSON(全局变量 设置字典))
  
  // 跳转
  调用 打开另一屏幕("Screen2")

3.3 Screen2读取数据

// Screen2:从TinyDB读取数据
当 Screen2.初始化 时
  初始化局部变量 用户名 = 调用 微数据库1.获取值("current_user", "游客")
  初始化局部变量 分数 = 调用 微数据库1.获取值("user_score", 0)
  初始化局部变量 设置JSON = 调用 微数据库1.获取值("settings", "{}")
  
  设置 标签_欢迎.文本 = 合并字符串("欢迎,", 用户名)
  设置 标签_分数.文本 = 合并字符串("分数:", 分数)
  
  // 解析设置
  初始化局部变量 设置字典 = 调用 字典.JSON转字典(设置JSON)

3.4 TinyDB的命名空间

不同Screen的TinyDB默认共享同一个存储空间。如需隔离,设置不同的 命名空间(Namespace) 属性:
// Screen1的TinyDB:命名空间 = "screen1"
// Screen2的TinyDB:命名空间 = "screen2"
// 这样两个Screen的数据互不干扰

四、方案三:单Screen设计(根本解决方案)

4.1 原理

垂直布局模拟多个”页面”,通过显示/隐藏布局切换,所有数据都在同一个Screen中,完全不存在跨Screen传值问题。
// 界面结构
Screen1
├── 布局_首页(可见)
├── 布局_详情(不可见)
├── 布局_设置(不可见)
└── 布局_关于(不可见)

// 切换"页面"
定义 切换到页面(页面名)
  设置 布局_首页.可见 = 页面名 = "首页"
  设置 布局_详情.可见 = 页面名 = "详情"
  设置 布局_设置.可见 = 页面名 = "设置"
  设置 布局_关于.可见 = 页面名 = "关于"

当 按钮_详情.被点击 时
  调用 切换到页面("详情")

当 按钮_返回.被点击 时
  调用 切换到页面("首页")

4.2 优点

  • 所有全局变量在同一Screen,完全共享
  • 无需传值,无需TinyDB
  • 切换更流畅(无Screen跳转动画延迟)

五、常见问题

Q1:“获取启动值”积木在哪里?

控制代码块分类中,搜索”启动值”即可找到。

Q2:传递的数据太大怎么办?

  • 启动值有长度限制,大数据用TinyDB
  • 复杂对象先用 字典转JSON 序列化,再存TinyDB

Q3:Screen关闭后数据还在吗?

  • 全局变量:Screen关闭后销毁
  • TinyDB:持久化,App重启后仍在
  • 启动值:只在跳转时有效

Q4:多个Screen之间如何共享实时数据?

推荐单Screen设计,或用TinyDB + 计时器定时刷新。

参考资料


文档版本:2026.03 | 作者:App Inventor 2 中文网 www.fun123.cn

参考资料与版权声明

原文来源

版权声明

本文档基于 MIT App Inventor 官方文档及社区资源整理,版权归原作者所有:
  • MIT App Inventor 官方文档采用 CC BY-SA 4.0 授权
  • MIT App Inventor Community 帖子版权归原作者所有
本文档由 ai2claw 🐝 整理,仅供学习参考,如有侵权请联系删除。