2017-05-09 11 views
2

私はネイティブのAndroidアプリを持っていますが、現在はこれにReact-Nativeの部分があります。Android int値のリアクションネイティブモジュールは、遅れて返されましたか?

要するに、Android/Javaネイティブのリストビューがあります。私が行をタップすると、私はReact-Nativeコードにつながる新しいActivityを開始します。

コンポーネントはAPI呼び出しを行いますが、コードを実行する前にReact Nativeモジュールを経由して、適切なAPIを作成できるようにヘッダーのJava/Android設定のユーザー設定から値を取得しますコール。

ザ・は/actions/index.jsネイティブAPI呼び出しリアクト:バックネイティブのAndroid/Javaで

export const toggleBlocked = (user_id) => 
async dispatch => { 
    try { 
    let headers = await getHeaders(); 
    const response = await fetch('http://my.domain.com/api/get_data?user_id=`${user_id}`', { headers, method: 'GET' }); 
    if (response.status == 200) { 
     // do stuff 
    } else {    
     ToastAndroid.show("Looks like the response wasnt good :(", ToastAndroid.LONG, ToastAndroid.CENTER); 
    } 
    } catch (error) { 
    ToastAndroid.show("An Error Occurred :(", ToastAndroid.LONG, ToastAndroid.CENTER); 
    } 
}; 


function getHeaders() { 
    let userId = UserService.getUserId() 
    console.log("2. React-Native | getHeaders... user_id is " + userId) 
    return (
    new Headers({ 
     Cookie: `abcxyz=${userId}`, 
     user_id: userId, 
     "User-Agent": "android", 
     "Content-Type": "application/json", 
     charset: "utf-8", 
     "app-version": "9.1.23", 
     Accept: "application/json" 
    }) 
) 
} 

を、私は私のモジュールや設定のパッケージを持っています。ここではUserServiceModule.java

@ReactMethod 
    public int getUserId() { 
     SharedPreferences settings = mContext.getSharedPreferences(Constants.SettingsPreference, Context.MODE_PRIVATE); 
     int userId = settings.getUserId(); 
     Log.d(TAG, "1. Java/Android code. UserID is " + userId); 
     return userId; 
    } 

私がコードを実行すると、user_idは常にnullです。私は自分のログが順番に表示されることを期待していました(番号のついたログを参照)。

"1. Java/Android code. UserID is 123" 
"2. React-Native | getHeaders... user_id is 123" 

洞察力はすばらしいでしょう。ありがとう。

UPDATE /ここSOLUTION が更新され、変更が正しく動作して物事を得ることです:

@ReactMethod 
public void getUserId(final Promise promise) { 
    SharedPreferences settings = mContext.getSharedPreferences(Constants.SettingsPreference, Context.MODE_PRIVATE); 
    int userId = settings.getUserId(); 
    Log.d(TAG, "1. Java/Android code. UserID is " + userId); 

    promise.resolve(Integer.toString(userId)); 
} 

答えて

1

@ReactMethod機能は常にvoidを返しと非同期であると仮定されています。あなたがnullになっているのは、あなたのJSコードが同期して書かれているからです。変数userIdをnullとして初期化し、非同期呼び出しの戻り値で設定します。しかし、あなたが書いたコードは同期的だったので、それは反応メソッドが値を返す前に次の行に行きます。

ディスパッチ方法と同じように非同期待機を行う必要があります。しかし、それは反応メソッドがvoid値を返すので十分ではありません。率直に言って、私は方法がエラーを見つけられなかったことが代わりにどのように引き起こされたのかわからない。おそらく@ReactMethodはJavaで定義した戻り値を無視しますか?

に関係なく、非同期待機を設定した後。ここで行ったことに似たようなことをしてください: https://facebook.github.io/react-native/docs/native-modules-android.html#callbacks

+1

ありがとう、私はちょうど正しい方向に私を指摘し、私はちょうど最終コードを含めるために私のポストを更新しました! –

関連する問題