TypeError:_ExpoSecureStore.default.getValueWithKeyAsync 不是函数

问题描述 投票:0回答:3

我正在尝试在我的 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,
  },
});
react-native expo
3个回答
1
投票
  1. 确保使用通配符导入来导入 Secure Store:

    import * as SecureStore from "expo-secure-store";
    
  2. 如果错误仍然存在,可能是因为您使用的是自定义开发者客户端。您将需要重建您的开发客户端才能使用安全存储库。


1
投票

我有一个类似的问题,并通过研究尝试了 3 个解决方案:

  1. 导入安全存储如下:

     import * as SecureStore from "expo-secure-store"
    
  2. 安装并使用 Secure Store 后重建您的开发客户端。

  3. 确保您使用正确的构建平台,例如 Android 设备或模拟器,或者 IOS 设备或模拟器。 Secure Store 不支持 Web 平台。


0
投票

似乎您尝试在网络中使用

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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.