Flutter Isolate 环境下 SharedPreferences 数据不能同步问题?

发布于 1周前 作者 itying888 来自 Flutter
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

1 回复

更多关于Flutter Isolate 环境下 SharedPreferences 数据不能同步问题?的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter的Isolate环境中,遇到SharedPreferences数据不能同步的问题,通常是由于SharedPreferences的实例在不同的Isolate之间是隔离的,它们不能直接共享内存中的状态。SharedPreferences是基于单线程模型的,其设计初衷是为了在主Isolate(UI线程)中方便地使用。

解决这个问题的方法主要有两种:

  1. 使用消息传递(Message Passing): Flutter提供了机制,允许在不同的Isolate之间通过消息传递进行通信。你可以在主Isolate中操作SharedPreferences,然后通过消息将需要更新的数据传递给其他Isolate,或者反过来,由其他Isolate将更改请求发送给主Isolate进行处理。

  2. 使用跨Isolate共享的数据存储: 考虑使用其他支持跨Isolate共享的数据存储方案,比如SQLite数据库或者其他持久化存储方案。这些方案通常提供了在多个Isolate间安全共享数据的机制。

此外,Flutter社区也有一些第三方库尝试解决Isolate间的数据共享问题,但使用这些库时需要谨慎,确保它们符合你的应用性能和安全需求。

总之,处理Flutter中Isolate环境下的SharedPreferences数据同步问题,关键在于理解Isolate的隔离性和数据共享的限制,并采取适当的通信或存储策略来实现跨Isolate的数据一致性。

回到顶部