Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to work with React Native Async Storage

Tags:

react-native

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.

like image 640
Manoj Kumar Avatar asked Jan 16 '16 16:01

Manoj Kumar


3 Answers

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.

like image 138
Lokesh Sinha Avatar answered Nov 14 '22 04:11

Lokesh Sinha


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

import { AsyncStorage } from 'react-native';
like image 41
mixdev Avatar answered Nov 14 '22 04:11

mixdev


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.

like image 2
Tarik Fojnica Avatar answered Nov 14 '22 04:11

Tarik Fojnica