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
相关产品推荐
相关产品推荐

