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的数据一致性。