Flutter已发布APK中的SharedPreference问题
我来帮你一步步定位这个问题,发布版APK里SharedPreferences失效大概率是几个常见的细节没处理好,咱们逐个排查:
先确认SharedPreferences初始化是否完成
很多时候问题出在异步初始化没等完就去读数据了!你得确保是在await SharedPreferences.getInstance()之后再调用getString,比如:// 正确的初始化方式 final prefs = await SharedPreferences.getInstance(); String encodedMap = prefs.getString('timeData'); // 后续解码逻辑如果没加
await,prefs可能还是个未完成的Future,这时候getString拿到的就是null,自然没内容。必须处理
encodedMap为null的情况
你的代码直接对encodedMap做json.decode,如果这个值是null(比如首次打开APP还没写入数据,或者之前的写入失败),会直接抛出异常,发布版Flutter默认会静默吞掉错误,导致界面空白。赶紧加上空判断:String encodedMap = prefs.getString('timeData'); if (encodedMap != null) { Map<String,dynamic> decodedMap = json.decode(encodedMap); print(decodedMap); } else { // 这里可以初始化默认数据或者给用户提示 print("SharedPreferences里还没存数据哦"); }确认数据是否真的成功写入
回忆下你写入数据的代码,是不是加了await?比如:await prefs.setString('timeData', json.encode(yourDataMap));如果没加
await,发布版的性能优化可能导致APP在数据持久化完成前就被关闭,导致数据根本没存进去。查看发布版的真实日志
发布版里print的内容默认看不到,你得换成debugPrint,然后用Android Studio的Logcat(选择对应的设备和APP进程)查看日志,这样就能知道到底是encodedMap为null,还是解码过程中出了错。检查插件和Flutter版本兼容性
试试更新shared_preferences插件到最新稳定版,同时确保你的Flutter是稳定版,旧版本可能存在一些发布版特有的兼容性bug。
内容的提问来源于stack exchange,提问作者Sohaib Mahmoud

