Как я могу сохранить, если флажок установлен с помощью asyncstorage? - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь сделать так, если этот флажок установлен, он должен сохранить его с помощью asyncstorage, но независимо от того, что я пытаюсь сделать, я не могу заставить его работать, и Google не дает мне ничего. Я также новичок в asyncstorage aswell.

import React, { Component } from 'react';
import { CheckBox } from 'react-native-elements'
import AsyncStorage from '@react-native-community/async-storage';

import Fontisto from 'react-native-vector-icons/Fontisto';


export default class Check extends Component {
  constructor(props) {
    super(props);
    this.state = {
      checked: 'false',

    };
  }

  storeData = async () => {
    try {
      await AsyncStorage.setItem('@storage_Key')
    } catch (e) {

    }
  }

  getData = async () => {
    try {
      const value = await AsyncStorage.getItem('@storage_Key')
      if(value !== null) {

      }
    } catch(e) {

    }
  }

  render() {
    return (
      <CheckBox
        checkedIcon={<Fontisto name='checkbox-active' size={15} color='#000' />}
        uncheckedIcon={<Fontisto name='checkbox-passive' size={15} color='#000' />}
        checked={this.state.checked}
        onPress={() => this.setState({ checked: !this.state.checked })}
      />
    );
  }
}

ОБНОВЛЕННЫЙ КОД НИЖЕ

import React, { Component } from 'react';
import { CheckBox } from 'react-native-elements'
import AsyncStorage from '@react-native-community/async-storage';

import Fontisto from 'react-native-vector-icons/Fontisto';


export default class Check extends Component {
  constructor(props) {
    super(props);
    this.state = {
      checked: false,

    };
  }

  storeData = async () => {
    try {
     await AsyncStorage.setItem('@storage_Key', JSON.stringnify({checked: false}))
    } catch (e) {
      console.log('error storing data')
      console.log(e)
    }
  }

  componentDidMount(getData) {
    getData = async () => {
      try {
        const value = await AsyncStorage.getItem('@storage_Key')
        if(value !== null) {
          this.setState({checked: JSON.parse(value).checked})
        }
      } catch(e) {
        console.log('error restoring data')
        console.log(e)
      }
    }
  }

  render() {
    return (
      <CheckBox
        checkedIcon={<Fontisto name='checkbox-active' size={15} color='#000' />}
        uncheckedIcon={<Fontisto name='checkbox-passive' size={15} color='#000' />}
        checked={this.state.checked}
        onPress={() => this.componentDidMount()}
      />
    );
  }
}

ЭТОТ ТЕКСТ ТОЛЬКО ЗДЕСЬ СЮДА STACKOVERFLOW, ЖАЛОБЫ НА БОЛЬШЕ КОДА, ЧЕМ ТЕКСТ.

Ответы [ 3 ]

0 голосов
/ 21 апреля 2020

Вы можете хранить только строку в AsyncStorage, поэтому перед сохранением зашифруйте значение вашего объекта, и вы также not passing any value while setting the item in AsyncStorage which you wanted to store, вот решение.

Храните так.

await AsyncStorage.setItem('@storage_Key', JSON.stringnify({checked: false}))

И получите вот так

const value = await AsyncStorage.getItem('@storage_Key')

Также после получения значения из хранилища setState до этого значения вот так

this.setState({checked: JSON.parse(value).checked})

Затем вызвал вашу функцию getData внутри componentDidMount

0 голосов
/ 21 апреля 2020

setItem принять 2 параметра: ключ и значение. Также, когда вы setState основаны на предыдущем состоянии, вы должны вызвать setState с обратным вызовом. И я также вижу, что вы не вызываете функцию storeData где-либо

import React, { Component } from 'react';
import { CheckBox } from 'react-native-elements'
import AsyncStorage from '@react-native-community/async-storage';

import Fontisto from 'react-native-vector-icons/Fontisto';


export default class Check extends Component {
  constructor(props) {
    super(props);
    this.state = {
      checked: 'false',

    };
  }

  storeData = async () => {
    await this.setState(prevState => ({ checked: !prevState.checked }))
    try {
      await AsyncStorage.setItem('@storage_Key', this.state.checked)
    } catch (e) {
      console.log(e);
    }
  }

  getData = async () => {
    try {
      const value = await AsyncStorage.getItem('@storage_Key')
      if(value !== null) {
        console.log(value);
      }
    } catch(e) {
      console.log(e);
    }
  }

  render() {
    return (
      <CheckBox
        checkedIcon={<Fontisto name='checkbox-active' size={15} color='#000' />}
        uncheckedIcon={<Fontisto name='checkbox-passive' size={15} color='#000' />}
        checked={this.state.checked}
        onPress={() => storeData()}
      />
    );
  }
}
0 голосов
/ 21 апреля 2020

Перво-наперво, я не вижу, как вы загружаете данные из хранилища. Вы должны вызвать функцию getData в событии жизненного цикла componentDidMount и обновить ваше состояние с помощью восстановленного значения.

Также вам необходимо добавить элемент, который вы хотите сохранить. Здесь - документация о том, как используется метод setItem. Как видите, вам также нужно передать некоторую строку. В вашем случае это может быть что-то вроде «проверено».

...