2016-03-30 5 views
1

私はReact Nativeアプリが0.18で、Android用の戻るボタン機能を実装しようとしています。私は私のindex.android.jsに次のコードを持っている:BackAndroid hardwareBackPressリスナーは初期ルートに戻った後に動作しなくなります

let navigator; 

BackAndroid.addEventListener('hardwareBackPress',() => { 
    if (navigator && navigator.getCurrentRoutes().length > 1) { 
    navigator.pop(); 
    return true; 
    } 
    return false; 
}); 

そして、私のレンダリング中:

<Navigator 
    ref={(nav) => { navigator = nav; }} 
    ... 

私は前方に任意の数の経路を行けば戻るボタンが機能する、と私は、その後の任意の数を戻ることができます初期ルートへのルート。ただし、最初のルートに戻った後、JSをリロードするか、アプリを再起動するまで、戻るボタンは機能しなくなります。

誰かがこれに遭遇し、解決策はありますか?

編集:私は0.21,0.22および0.23-rc3でテストしましたが、最新のリリースでこの問題が引き続き発生しています。

+0

私は非常に似たコードを持っており、そのコードでは、最初のルートに戻るときに戻るボタンがアプリケーション全体を終了します。これが目的でしたよね? – zvona

+0

多少。私はアプリを起動し、すぐに戻るボタンをクリックすると、それはアプリを終了します。しかし、私はアプリを起動する場合は、任意のルートに進み、戻るボタンをクリックして、もう一度戻るボタンをクリックしてもアプリケーションを終了しないで、私は別のルートに戻る場合は、それはどちらかといえば初期のルートに。 – NeuroXc

+0

基本的には、最初のルートに戻った後にリスナーがリッスンを停止したようです。ハンドラにconsole.logを置くと、初期ルートに戻った後に再度クリックしても起動しません。 – NeuroXc

答えて

0

アプリの他のコンポーネントでは、キーボードを開いたときにレイアウトの変更を処理するイベントハンドラが追加されていて、これらのコンポーネントをアンマウントすると、DeviceEventEmitter.removeAllListeners()が呼び出されていたようです。直観とは逆に、インスタンス化するコンポーネントに関係なく、この呼び出しはすべてのリスナーをグローバルに削除し、DeviceEventEmitterではなくBackAndroidでインスタンス化されたリスナーにも適用されます。したがって、キーボードトグルレイアウトを持つコンポーネントから戻った後に、hardwareBackPressリスナーも削除され、戻るボタンが機能しなくなりました。

removeAllListenersをより具体的な呼び出しにする。 DeviceEventEmitter.removeAllListeners('keyboardWillShow');がこの問題を解決しました。

+0

私はOPとまったく同じ問題を抱えていますが、私のコードでは 'DeviceEventEmitter.removeAllListeners()'を使用していません。何がこの動作を引き起こす可能性がありますか? – Romy

関連する問題