2017-12-28 14 views
0

次の問題があります。私はこのような反応-ネイティブどの多かれ少なかれルックスでクラスを持っている:。componentDidMountの反応ネイティブでリスナーを設定しますが、呼び出されない新しい画面にディスパッチ

import {...}; 

const ReadyButton = props => (
    <View> 
    <RoundButton 
     width={175} 
     text="..." 
     onPress={props.onPress} 
    /> 
    </View> 
); 

ReadyButton.propTypes = { 
    onPress: PropTypes.func, 
}; 

const ReadyButtonContainer = connect(null, dispatch => ({ 
    onPress:() => { 
    dispatch(askIgnoreBatteryOptimizations(requestLocationPermissions)); 
    }, 
}))(ReadyButton); 

export default class CalibrationWalkInstructions extends Component { 
    componentDidMount() { 
    listenToPermissionChanges(); 
    } 

    render() { 
    const enableBackgroundDataCollectionMessage = (Platform.OS === 'ios') 
     ? '...' 
     : '...'; 

    return (
     <ScreenWrapper> 
     <CenterContent> 
      <StandardWrapper spacing={15}> 
      <FullWidthImage 
       source={PhoneInPocketIconImage} 
       width={300} 
       height={380} 
       scale={0.6} 
      /> 
      </StandardWrapper> 
      <StandardWrapper spacing={15}> 
      <PrimaryText> 
      ... 
      </PrimaryText> 
      </StandardWrapper> 
      <StandardWrapper> 
      <PrimaryText> 
       {enableBackgroundDataCollectionMessage} 
      </PrimaryText> 
      </StandardWrapper> 
      <ReadyButtonContainer /> 
     </CenterContent> 
     <TutorialBottomProgress currentStep={2} stepName={'Walk'} align={'right'} /> 
     </ScreenWrapper> 
    ); 
    } 
}; 

さらに私はすべての機能がのどこにいるかactions.jsと呼ばれるファイルを持ってここから私がアタッチ次の関数を呼び出したいですロケーションのパーミッションがiOS設定で許可または変更されている場合はリスナーです。関数のコールバックは、ユーザーを次の画面に直接導きます。 action.jsでMy機能は、これまでのようになります。

export function listenToPermissionChanges() { 
    console.log('FOOO listenToPermissionChanges called'); 
    return function(dispatch) { 
    console.log('FOOO inside dispatch'); 
    listenToLocationPermissionChanges(function() { 
     detachLocationPermissionChangeListener(); 
     console.log('FOOO dispatch now'); 
     dispatch({ 
     type: LOCATION_PERMISSION_GRANTED, 
     }); 
     dispatch(goToWalkCalibration()); 
    }); 
    }; 
} 

私は上記のように、私はさらに最初のザ・フー・コンスピラシーログステートメントに届かなくすることができる午前)componentDidMount(この関数を呼び出した場合。私の質問は今、なぜそれ以上のことになりませんか? componentDidMount()関数からディスパッチコールを呼び出すことができないという問題がありますか?return文がないか、または残りの部分が実行されるのはなぜですか?

ご協力ありがとうございます。

+1

あなたの 'listenToPermissionChanges()'は2番目の関数(Currying)を返します。両方の部分を実行するには、 'listenToPermissionChanges()(dispatch)'を実行する必要があります - 非常に簡単な例として、ここを見てくださいhttps://jsfiddle.net/arrbgbqn/ – Dan

答えて

0

男は質問にコメントしました。私はそれを解決したlistenToPermissionChanges()(dispatch)

何とかcomponentDidMount()機能で何かをディスパッチすることはできませんが。したがって、私はただReadyButtonContainerのlistenToPermissionChanges関数を呼び出します。これは今のようになります:

const ReadyButtonContainer = connect(null, dispatch => ({ 
    onPress:() => { 
    dispatch(askIgnoreBatteryOptimizations(requestLocationPermissions)); 
    listenToPermissionChanges()(dispatch); 
    }, 
}))(ReadyButton); 
関連する問題