Flutter Isolate 环境下 SharedPreferences 数据不能同步问题?
cronStock() async {
_stockCode = _stockCodeController.value.text;
_growRate = _growRateController.value.text;
_reduceRate = _reduceRateController.value.text;
……
saveData();
refreshStock(true);
await AndroidAlarmManager.periodic(const Duration(seconds: 30), periodicAlarmID, refreshStock, wakeup: true);
}
saveData() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.reload();
try {
print('0001 saveData: '+DateTime.now().toString());
prefs.setString(‘stock_prefix’, stockPrefix);
prefs.setString(‘stock_code’, _stockCodeController.value.text);
prefs.setDouble(‘grow_rate’, double.parse(_growRateController.value.text));
prefs.setDouble(‘reduce_rate’, double.parse(_reduceRateController.value.text));
} on FormatException catch(e) {
} catch (e) {
// No specified type, handles all
}
}
……
refreshStock([bool isManual = false]) {
print('0002 refreshStock afterTimer: '+DateTime.now().toString());
Future<List> stockShared = getShared();
stockShared.then((List shared) {
print('isManual: $isManual');
print('shareData: $shared');
});
}
Future<List> getShared() async {
print(‘getShared’);
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.reload();
return [
prefs.getString(‘stock_prefix’),
prefs.getString(‘stock_name’),
prefs.getString(‘stock_code’),
prefs.getDouble(‘grow_rate’),
prefs.getDouble(‘reduce_rate’),
// 当前值
prefs.getString('stock_price'),
prefs.getDouble('stock_rate'),
prefs.getInt('rate_color'),
];
}
AndroidAlarmManager 插件用到了 Isolate 环境,在 Isolate 环境下 refreshStock 函数中的 getShared()拿到的 SharedPreferences 数和上面 saveData()存储的数据不同步,要多次间隔调用的后才会同步到。
Flutter Isolate 环境下 SharedPreferences 数据不能同步问题?
更多关于Flutter Isolate 环境下 SharedPreferences 数据不能同步问题?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Isolate 环境下 SharedPreferences 数据不能同步问题?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter的Isolate环境中,遇到SharedPreferences数据不能同步的问题,通常是由于SharedPreferences的实例在不同的Isolate之间是隔离的,它们不能直接共享内存中的状态。SharedPreferences是基于单线程模型的,其设计初衷是为了在主Isolate(UI线程)中方便地使用。
解决这个问题的方法主要有两种:
-
使用消息传递(Message Passing): Flutter提供了机制,允许在不同的Isolate之间通过消息传递进行通信。你可以在主Isolate中操作SharedPreferences,然后通过消息将需要更新的数据传递给其他Isolate,或者反过来,由其他Isolate将更改请求发送给主Isolate进行处理。
-
使用跨Isolate共享的数据存储: 考虑使用其他支持跨Isolate共享的数据存储方案,比如SQLite数据库或者其他持久化存储方案。这些方案通常提供了在多个Isolate间安全共享数据的机制。
此外,Flutter社区也有一些第三方库尝试解决Isolate间的数据共享问题,但使用这些库时需要谨慎,确保它们符合你的应用性能和安全需求。
总之,处理Flutter中Isolate环境下的SharedPreferences数据同步问题,关键在于理解Isolate的隔离性和数据共享的限制,并采取适当的通信或存储策略来实现跨Isolate的数据一致性。