Manoj Kumar
Manoj Kumar

Reputation: 131

Unable to work with React Native Async Storage

I am having difficulty working with react native async storage. Most of the time my code jumps off the current execution and goes to the next line without getting the results from the current line. I am getting errors most of the time.

I tried this example-

'use strict';

var React = require('react-native');
var {
  AsyncStorage,
  PickerIOS,
  Text,
  View
} = React;
var PickerItemIOS = PickerIOS.Item;

var STORAGE_KEY = '@AsyncStorageExample:key';
var COLORS = ['red', 'orange', 'yellow', 'green', 'blue'];

var BasicStorageExample = React.createClass({
  componentDidMount() {
    this._loadInitialState().done();
  },

  async _loadInitialState() {
    try {
      var value = await AsyncStorage.getItem(STORAGE_KEY);
      if (value !== null){
        this.setState({selectedValue: value});
        this._appendMessage('Recovered selection from disk: ' + value);
      } else {
        this._appendMessage('Initialized with no selection on disk.');
      }
    } catch (error) {
      this._appendMessage('AsyncStorage error: ' + error.message);
    }
  },

  getInitialState() {
    return {
      selectedValue: COLORS[0],
      messages: [],
    };
  },

  render() {
    var color = this.state.selectedValue;
    return (
      <View>
        <PickerIOS
          selectedValue={color}
          onValueChange={this._onValueChange}>
          {COLORS.map((value) => (
            <PickerItemIOS
              key={value}
              value={value}
              label={value}
            />
          ))}
        </PickerIOS>
        <Text>
          {'Selected: '}
          <Text style={{color}}>
            {this.state.selectedValue}
          </Text>
        </Text>
        <Text>{' '}</Text>
        <Text onPress={this._removeStorage}>
          Press here to remove from storage.
        </Text>
        <Text>{' '}</Text>
        <Text>Messages:</Text>
        {this.state.messages.map((m) => <Text key={m}>{m}</Text>)}
      </View>
    );
  },

  async _onValueChange(selectedValue) {
    this.setState({selectedValue});
    try {
      await AsyncStorage.setItem(STORAGE_KEY, selectedValue);
      this._appendMessage('Saved selection to disk: ' + selectedValue);
    } catch (error) {
      this._appendMessage('AsyncStorage error: ' + error.message);
    }
  },

  async _removeStorage() {
    try {
      await AsyncStorage.removeItem(STORAGE_KEY);
      this._appendMessage('Selection removed from disk.');
    } catch (error) {
      this._appendMessage('AsyncStorage error: ' + error.message);
    }
  },

  _appendMessage(message) {
    this.setState({messages: this.state.messages.concat(message)});
  },
});

exports.title = 'AsyncStorage';
exports.description = 'Asynchronous local disk storage.';
exports.examples = [
  {
    title: 'Basics - getItem, setItem, removeItem',
    render(): ReactElement { return <BasicStorageExample />; }
  },
];

This works. But, my functions doesn't work as expected. I am getting undefined.

Upvotes: 11

Views: 12152

Answers (3)

Tarik Fojnica
Tarik Fojnica

Reputation: 685

In case someone is using AsyncStorage.multiSet([]), make sure that none of your values is null or undefined. Otherwise, it won't work and and won't set value to the valid key-value pairs.

Upvotes: 2

mixdev
mixdev

Reputation: 2844

For others who still couldn't fix this issue: import AsyncStorage from react-native instead of React.

import { AsyncStorage } from 'react-native';

Upvotes: 21

Lokesh Sinha
Lokesh Sinha

Reputation: 106

After reading your question, first thing I felt is "maybe" you are new to ES7, specifically async-await. Please read about async-await functions in ES7 which is about to be realeased later this year(2016).

Your functions have to be async in nature. Put the keyword before the function. And await has to be used where you make a call to the function.

Specifically I suggest you use react-native-store repo for your development. React Native guys have told to use this and other implementations clearly agreeing AsyncStorage is a bit complex to work with.

Upvotes: 8

Related Questions