0

这是我的App.js,其他一切都是我能得到的标准/简单。

import React from 'react';
import { AsyncStorage, Text, View } from 'react-native';

export default class App extends React.Component {
  render() {

    console.log("Fetching data")
    AsyncStorage.getItem('@MySuperStore:key', (value) => {
      console.log("Fetched data: ", value)
      if(value == null) {
        console.log("Writing data!")
        AsyncStorage.setItem('@MySuperStore:key', 'data', () => {
          console.log("Wrote data!")
        })
      }
    })

    return(
    <View>
      <Text>Hello, ReplIt</Text>
    </View>
    );
  }
}

获取value的总是null.

我在本地和 ReplIt 上都试过了。在所有情况下,数据都不会在应用程序加载后持续存在;我总是看到:

Fetching data
Fetched data:  null
Writing data!
Wrote data!

我究竟做错了什么?我对 Expo 如何与持久存储交互有不正确的假设吗?AFAIK,AsyncStorage应该将东西保存到设备中;所以我可以关闭并重新打开应用程序并使数据保持不变。

4

2 回答 2

3

UPD:我刚刚意识到您的代码按预期工作......可能是评论中提到的重复问题。

避免方法中的任何请求和异步调用render,因为它可能会被调用多次,具体取决于道具或状态的变化方式。最好按照文档componentDidMount中的建议将所有相关代码放入。组件挂载时只会调用一次。

不知道为什么你的代码不适合你,回调是允许的AsyncStorage,但是等待对我来说很好:

import React from "react";
import { AsyncStorage, Text, View } from "react-native";

export default class App extends React.Component {
  constructor() {
    super();
    this.state = {
      storedValue: null
    };
  }
  async componentDidMount() {
    let storedValue = await AsyncStorage.getItem("@MySuperStore:key");
    console.log("Fetched data: ", storedValue);
    if (storedValue == null) {
      console.log("Writing data!");
      storedValue = await AsyncStorage.setItem("@MySuperStore:key", "data");
    }
    this.setState({
      storedValue
    });
  }

  render() {
    const { storedValue } = this.state;
    return (
      <View>
        <Text>Hello, ReplIt</Text>
        <Text>This is Stored Value, '{storedValue}'</Text>
      </View>
    );
  }
}
于 2017-10-17T21:12:50.333 回答
2

试试这些。AsyncStorage 是一个基于 Javascript Promise 的方法。

AsyncStorage.getItem('@MySuperStore:key')
.then(value => console.log(value))

或者

value = await AsyncStorage.getItem('@MySuperStore:key');
console.log(value);
于 2017-10-17T20:44:39.463 回答