uni-app uni.getStorageSync获取不到数据

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app uni.getStorageSync获取不到数据

操作步骤

先加载add,点击按钮后打开drawroute,绘制完成后与点击完成按钮调用uni.setStorageSync储存数据,然后点击返回按钮回到上一页,在上一页的onshow里调用uni.getStorageSync,获取不到数据

预期结果

能够获取到数据

实际结果

无法获取,找不到数据

bug描述

先加载add,点击按钮后打开drawroute,绘制完成后与点击完成按钮调用uni.setStorageSync储存数据,然后点击返回按钮回到上一页,在上一页的onshow里调用uni.getStorageSync,获取不到数据

img img img

开发环境信息

项目 信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 11
HBuilderX类型 正式
HBuilderX版本号 4.45
手机系统 Android
手机系统版本号 Android 10
手机厂商 vivo
手机机型 S7
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

16 回复

我刚试了下,用官方demo没发现问题 你可以新建个项目,用官方demo里试试,看好使不


我是在renderjs里回调server层的函数进行存储,名字,存储我都验证过 没问题,就找不到原因

我在其他地方使用都没问题 只有这一个地方取不到数据

回复 2***@qq.com: 你在存的地打个日志,看key 跟value都有值么,存完后立马再取你看看有不

回复 套马杆的套子: 有值的

回复 2***@qq.com: 我看你unload的时候是有清么?看看界面里哪有清的,然后新界面别在onshow里取,或者延期点时间再取试试呢,

回复 套马杆的套子: 只有这一个地方有清,调用uni.navigateBack之后就取不到了

回复 套马杆的套子: uni.navigateBack({ success: () => { // 回退成功后执行的代码 let routedata = uni.getStorageSync(“routeDetail”); console.log(“drawroute.vue保存航迹取值Back”, routedata) } });

回复 2***@qq.com: 换成uni.navigateTo试试呢

回复 套马杆的套子: 可以获取

回复 套马杆的套子: 那uni.navigateBack为什么就获取不到了呢?

回复 2***@qq.com: 还是因为你的onUnload里的问题,,因为navigateTo是不触发onUnload的,navigateBack会触发。所以问题就在onUnload里了

回复 套马杆的套子: onload里的清除是上一页的,不是调用navigateBack的页面的,而且我之前试了屏蔽清除代码,也不行

回复 套马杆的套子: 我将所有的uni.clearStorageSync全都屏蔽掉,然后就可以读取了,但是有的key是别的值,跟这个并不相同,为什么会有影响?

回复 套马杆的套子: 我又试了,确实是onload里代码的影响,但是onload里的key和无法获取到的数据的key不是同一个

uni-app 中,如果你发现 uni.getStorageSync 无法获取到数据,这通常可能由几个原因引起,包括数据未正确存储、存储键名有误、存储的数据类型不兼容或者存储操作在异步环境中未完成等。以下是一些排查和解决问题的代码示例,帮助你确保数据能够被正确存储和读取。

1. 确保数据已正确存储

首先,确保你在某个地方已经使用了 uni.setStorageSync 方法存储了数据。例如:

// 存储数据
uni.setStorageSync('myKey', 'myValue');

2. 检查存储和读取的键名是否一致

确保你存储数据时使用的键名与读取数据时使用的键名完全一致。键名是区分大小写的。

// 存储数据
uni.setStorageSync('myKey', 'myValue');

// 读取数据
const value = uni.getStorageSync('myKey');
console.log(value); // 应该输出 'myValue'

3. 处理存储的数据类型

如果你存储的是复杂数据类型(如对象、数组),确保在读取时正确处理这些数据。

// 存储对象
const obj = { name: '张三', age: 30 };
uni.setStorageSync('userInfo', obj);

// 读取对象
const userInfo = uni.getStorageSync('userInfo');
console.log(userInfo); // 应该输出 { name: '张三', age: 30 }

4. 异步存储和同步读取的注意事项

如果你是在异步操作中存储数据(例如,在网络请求后存储响应数据),确保存储操作完成后再进行读取。虽然 uni.setStorageSync 是同步的,但如果你之前使用了 uni.setStorage(异步版本),则需要等待其完成。

// 异步存储示例(通常不推荐与 sync 方法混用)
uni.setStorage({
    key: 'asyncKey',
    data: 'asyncValue',
    success: function () {
        // 存储成功后读取
        const asyncValue = uni.getStorageSync('asyncKey');
        console.log(asyncValue); // 应该输出 'asyncValue'
    }
});

5. 调试技巧

如果以上步骤都确认无误,但问题依旧存在,可以尝试清除存储后重新存储数据,或者检查是否有其他地方(如其他页面或组件)修改了存储的内容。

// 清除存储
uni.removeStorageSync('myKey');

// 重新存储并读取
uni.setStorageSync('myKey', 'newValue');
const newValue = uni.getStorageSync('myKey');
console.log(newValue); // 应该输出 'newValue'

通过上述步骤,你应该能够定位并解决 uni.getStorageSync 无法获取数据的问题。如果问题依然存在,请检查控制台是否有错误信息,或者进一步检查代码逻辑。

回到顶部