2015-11-05 10 views
25

AsyncStorageComponentWillMountに保存すると、accessTokenにローカルに格納されますが、render()機能が実行された後に約束を返します。約束が完了するまで、どうすればrender()を待つことができますか?ありがとうございました。ReactネイティブAsyncStorageはレンダリング後にデータを取得します

+1

?これを回避する方法の1つは、空の変数をgetInitalState関数に格納し、AsyncStorageが値を返すときに新しい値で状態を設定することです。 –

+0

質問をいただきありがとうございます。AsyncStorageからローカルに格納されたaccessTokenを取得して状態を設定しています。しかし、それが約束を返すので、render()関数は最初に実行され、その後すぐに状態が設定されます。だから私はrender()が状態をチェックしてログインページやメインアプリを返すので、私がアプリを訪れるたびに簡単にログインページを見る(〜0.1秒)。 – skleest

+1

ああ、大丈夫です。ローダー/ローディング・メッセージを表示してから、ログイン・ビューまたはログイン・ビューのいずれかに置き換える以外に、それを修正する方法がわかりません。 –

答えて

43

から情報を取得として、ロード画面は、あなたとしてそれを再レンダリングしてもらいます。私が取り組んでいるアプリケーションで行ったことは、AsyncStorageからの約束が解決されるまで、読み込み画面を追加することです。以下の例を参照してください:

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

class Screen extends React.Component { 

    state = { 
    isLoading: true 
    }; 

    componentDidMount() { 
    AsyncStorage.getItem('accessToken').then((token) => { 
     this.setState({ 
     isLoading: false 
     }); 
    }); 
    }, 

    render() { 
    if (this.state.isLoading) { 
     return <View><Text>Loading...</Text></View>; 
    } 
    // this is the content you want to show after the promise has resolved 
    return <View/>; 
    } 

} 

を状態オブジェクトにisLoadingプロパティを設定すると、再描画が発生しますと、あなたはaccessTokenに依存しているコンテンツを表示することができます。

私は、AsyncStorageのデータ管理を簡略化するreact-native-simple-storeという小さなライブラリを作成しました。あなたはそれが有用であることを願っています。反応ネイティブdocに基づいて

+4

最新のReact Nativeバージョンではまだ動作していますか?私はこのコードを正確に実装しましたが、「読み込み中...」という言葉は永遠に続きます。コンソールのログをレンダリングしてisLoading(ifメソッドなし)を表示すると、返り値はfalse、それからtrueであるため、理論的には動作するはずです。しかし、ifメソッドを有効にして 'Loading'を永久に止めれば、ログはfalseを返します。 – Hasen

+0

私は上記のHasenと同じ問題を抱えています。私のrender()関数は、状態が更新された後、二度目に呼び出されることはありません。だから私の読み込み画面は無期限に表示されます.... – Dygerati

+0

私は同じ問題を抱えていました。誰かがこれを解決する方法を手に入れましたか? – DsEsteban

-3

リアクションネイティブは、ブロッキング関数をサポートしていないJavascriptに基づいています。これは、UIが固まったり、反応しないようにしたくないため意味があります。 あなたができることは、レンダー機能でこれを処理することです。すなわちあなたはrenderは、私の知る限り待つことはできませんあなたがAsyncStorage

+1

状態変数を更新すると「再レンダリング」されます。つまり、レンダリング機能が再び呼び出されます。 –

5

は、あなたがこのような何かを行うことができます。

正確にあなたがデータをどうしようとしている何
import React, { Component } from 'react'; 
import { 
    View, 
} from 'react-native'; 

let STORAGE_KEY = '@AsyncStorageExample:key'; 

export default class MyApp extends Component { 

    constructor(props) { 
    super(props); 
    this.state = { 
     loaded: 'false', 
    }; 
    } 

    _setValue = async() => { 
    try { 
     await AsyncStorage.setItem(STORAGE_KEY, 'true'); 
    } catch (error) { // log the error 
    } 
    }; 

    _loadInitialState = async() => { 
    try { 
     let value = await AsyncStorage.getItem(STORAGE_KEY); 
     if (value === 'true'){ 
     this.setState({loaded: 'true'}); 
     } else { 
     this.setState({loaded: 'false'}); 
     this._setValue(); 
     } 
    } catch (error) { 
     this.setState({loaded: 'false'}); 
     this._setValue(); 
    } 
    }; 

    componentWillMount() { 
    this._loadInitialState().done(); 
    } 

    render() { 
    if (this.state.loaded === 'false') { 
     return (
     <View><Text>Loading...</Text></View> 
    ); 
    } 
    return (
     <View><Text>Main Page</Text></View> 
    ); 
    } 
}