2017-06-05 7 views
0

キーボードを開いたときにアニメーションを実行し、閉じるときに元の状態に戻したいです。キーボードリスナーはthis.stateを変更できません

問題がある:

未定義のは、私は良い作品Keyboard.listenerを持っている( 'this.state.scaleValue' を評価)オブジェクト

ではありません。

州:

this.state = { 
     scaleValue: new Animated.Value(0), 
    } 

アニメーション表示

<Animated.View style={styles.logoContainer, 
    { 
     transform: [ 
      {scale: logoScale} 
     ] 
    } 
}> 
    <Image source={require('./someimage.png')} style={{width: 64, height: 64}} /> 
</Animated.View> 

補間

const logoScale = this.state.scaleValue.interpolate({ 
     inputRange: [0, 0.5, 1], 
     outputRange: [1, 0.5, 0] 
    }); 

トリガー

_keyboardDidShow() { 
    this.state.scaleValue.setValue(0); 
    Animated.timing(
     this.state.ScaleValue, 
     { 
      toValue: 1, 
      duration: 300, 
      easing: Easing.easeOutBack 
     } 
    ).start(); 
    } 

それで、私は、トリガのコードを関数に入れ、それをTouchableでonPressと呼ぶと、それは機能します。

+0

'this'は' Animated.timing'に提供された関数内で同じコンテキストではありません。あなたがバインドする必要があります: 'this._keyboardDidShow = this._keyboardDidShow.bind(this)'それがうまくいかない場合は、おそらく 'timing = 'の呼び出しの上に' let me = this'を設定することもできます(そして '私の方法で)。 – G0dsquad

+0

@ G0dsquadあなたが正しいです。ありがとう。 – Mirakurun

+0

いいえ問題は、私はあなたのための答えとしてそれを追加しました:) – G0dsquad

答えて

1

thisは、Animated.timingに提供された関数内で同じコンテキストを持っていません。

あなたがメソッドをバインドする必要があります。

this._keyboardDidShow = this._keyboardDidShow.bind(this)

問題が解決しない場合は、おそらくtimingに呼び出し上記let me = thisを設定(およびtimingの本体内meとしてそれを参照することができますメソッド呼び出し)。

+1

あなたもES6の矢印機能を使用することができます。矢印関数内の 'this 'は自動的に外側スコープ(コンポーネント)に設定されます。 – Dan

+0

本当にあなたが好きなら、これを答えに自由に編集することができます – G0dsquad

関連する問題