我正在尝试在我的 React Native 中使用 expo-secure-store。我收到以下错误:
可能的未处理的承诺拒绝(id:2):TypeError:_ExpoSecureStore.default.getValueWithKeyAsync 不是函数。 (在 '_ExpoSecureStore.default.getValueWithKeyAsync(key, options)' 中,'_ExpoSecureStore.default.getValueWithKeyAsync' 未定义)
我尝试寻找解决方案,但找不到。 所以我尝试使用docs中给出的示例代码进行检查,但错误仍然是类似的错误: 可能的未处理的承诺拒绝(id:1):错误:方法或属性 SecureStore.setItemAsync 在 Android 上不可用,您确定已正确链接所有本机依赖项吗?
这是我使用的代码:
import * as React from 'react';
import { Text, View, StyleSheet, TextInput, Button } from 'react-native';
import * as SecureStore from 'expo-secure-store';
async function save(key, value) {
await SecureStore.setItemAsync(key, value);
}
async function getValueFor(key) {
let result = await SecureStore.getItemAsync(key);
if (result) {
alert("🔐 Here's your value 🔐 \n" + result);
} else {
alert('No values stored under that key.');
}
}
export default function App() {
const [key, onChangeKey] = React.useState('Your key here');
const [value, onChangeValue] = React.useState('Your value here');
return (
<View style={styles.container}>
<Text style={styles.paragraph}>Save an item, and grab it later!</Text>
{}
<TextInput
style={styles.textInput}
clearTextOnFocus
onChangeText={text => onChangeKey(text)}
value={key}
/>
<TextInput
style={styles.textInput}
clearTextOnFocus
onChangeText={text => onChangeValue(text)}
value={value}
/>
{}
<Button
title="Save this key/value pair"
onPress={() => {
save(key, value);
onChangeKey('Your key here');
onChangeValue('Your value here');
}}
/>
<Text style={styles.paragraph}>🔐 Enter your key 🔐</Text>
<TextInput
style={styles.textInput}
onSubmitEditing={event => {
getValueFor(event.nativeEvent.text);
}}
placeholder="Enter the key for the value you want to get"
/>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: 10,
backgroundColor: '#ecf0f1',
padding: 8,
},
paragraph: {
marginTop: 34,
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
},
textInput: {
height: 35,
borderColor: 'gray',
borderWidth: 0.5,
padding: 4,
},
});
确保使用通配符导入来导入 Secure Store:
import * as SecureStore from "expo-secure-store";
如果错误仍然存在,可能是因为您使用的是自定义开发者客户端。您将需要重建您的开发客户端才能使用安全存储库。
我有一个类似的问题,并通过研究尝试了 3 个解决方案:
导入安全存储如下:
import * as SecureStore from "expo-secure-store"
安装并使用 Secure Store 后重建您的开发客户端。
确保您使用正确的构建平台,例如 Android 设备或模拟器,或者 IOS 设备或模拟器。 Secure Store 不支持 Web 平台。
似乎您尝试在网络中使用
expo-secure-store
。 Expo Secure Store API 不适用于网络。它仅适用于移动设备。请改用这种方法。
import * as React from 'react';
import { Text, View, StyleSheet, TextInput, Button, Platform } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import * as SecureStore from 'expo-secure-store';
async function save(key, value) {
try {
if (Platform.OS === 'web') { // web
await AsyncStorage.setItem(key, value);
} else { // mobile
await SecureStore.setItemAsync(key, value.toString()); // Convert value to string for SecureStore
}
} catch (error) {
console.error("Error saving data:", error);
}
}
async function getValueFor(key) {
try {
if (Platform.OS === 'web') { // web
const result = await AsyncStorage.getItem(key);
if (result) {
alert("🔐 Here's your value 🔐 \n" + result);
} else {
alert('No values stored under that key.');
}
} else { // mobile
const result = await SecureStore.getItemAsync(key);
if (result) {
alert("🔐 Here's your value 🔐 \n" + result);
} else {
alert('No values stored under that key.');
}
}
} catch (error) {
console.error("Error retrieving data:", error);
}
}