You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何在类中初始化顶级变量并在顶级函数中保留其值?

问题分析与解决

为什么修改后的顶级变量在compute里还是初始值?

Flutter的compute函数会创建一个独立的Isolate(隔离线程),每个Isolate都有自己完全独立的内存空间,和主Isolate的内存不共享。你在主Isolate里修改g_num的值,只是修改了主Isolate内存里的变量副本;而_testfunction是在新启动的Isolate里执行的,这个新Isolate会重新初始化所有顶级变量,所以它读取到的g_num是初始值0。

正确的解决方法

方法1:直接把变量作为参数传递给compute

这是最简单的方式,利用compute的第二个参数传递最新的变量值给目标函数:
修改你的顶级函数,让它接收参数:

int g_num = 0;

Future<void> _testfunction(int num) async {
  print('g_num : $num');
}

调用时直接传入修改后的g_num:

g_num = 1000;
print('num : $g_num'); // 输出1000
await compute(_testfunction, g_num); // 输出1000

方法2:用消息传递共享状态(适合复杂场景)

如果需要在多个Isolate之间共享状态,不能直接访问变量,要通过Isolate之间的消息传递机制。比如可以创建一个主Isolate负责维护状态,其他Isolate通过发送消息请求获取最新值,或者主Isolate主动推送更新。

方法3:用持久化存储临时保存(适合简单数据)

如果变量不需要频繁修改,也可以用SharedPreferences这类持久化存储,在主Isolate里修改后保存,在_testfunction里读取存储的值:

// 主Isolate里保存
g_num = 1000;
await SharedPreferences.getInstance().then((prefs) {
  prefs.setInt('g_num', g_num);
});

// _testfunction里读取
Future<void> _testfunction(int n) async {
  final prefs = await SharedPreferences.getInstance();
  final num = prefs.getInt('g_num') ?? 0;
  print('g_num : $num');
}

注意:这种方式适合数据不频繁变更的场景,因为持久化读写有一定开销。

内容的提问来源于stack exchange,提问作者Jungwon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:35:14