Fix refreshing state

Summary:When RefreshControl.refreshing change twice within 250ms, it ignores the second changing.

**Test plan (required)**

```
refresh () {
  this.setState({
    refreshing: true
  })

  fetch('/api')
  .then(() => {
    this.setState({
      refreshing: false
    })
  })
  .catch((error) => {
    this.setState({
      refreshing: false
    })
  })
}

render() {
  return (
    <ScrollView
      refreshControl={
        <RefreshControl
          refreshing={this.state.refreshing}
          onRefresh={this.refresh.bind(this)}
        />
      }>
      <TouchableHighlight onPress={this.refresh.bind(this)}>
        <View>
          <Text>Touch Me!</Text>
        </View>
      </TouchableHighlight>
    </ScrollView>
  )
}
```

* Test Case 1: Touch "Touch Me!", if get response less than 250ms, the state is always refreshing.

* Test Case 2: Close network, Touch "Touch Me!", the state is always refreshing.
Closes https://github.com/facebook/react-native/pull/6737

Differential Revision: D3189627

fb-gh-sync-id: 81c1932408e1ab99732b8340a5e3bd557629a66b
fbshipit-source-id: 81c1932408e1ab99732b8340a5e3bd557629a66b
This commit is contained in:
Li Jie 2016-04-17 00:32:28 -07:00 committed by Facebook Github Bot 2
parent 7851572b40
commit 93b39b7326
1 changed files with 7 additions and 1 deletions

View File

@ -14,6 +14,7 @@
@implementation RCTRefreshControl { @implementation RCTRefreshControl {
BOOL _initialRefreshingState; BOOL _initialRefreshingState;
BOOL _isInitialRender; BOOL _isInitialRender;
BOOL _currentRefreshingState;
} }
- (instancetype)init - (instancetype)init
@ -21,6 +22,7 @@
if ((self = [super init])) { if ((self = [super init])) {
[self addTarget:self action:@selector(refreshControlValueChanged) forControlEvents:UIControlEventValueChanged]; [self addTarget:self action:@selector(refreshControlValueChanged) forControlEvents:UIControlEventValueChanged];
_isInitialRender = true; _isInitialRender = true;
_currentRefreshingState = false;
} }
return self; return self;
} }
@ -105,7 +107,9 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
- (void)setRefreshing:(BOOL)refreshing - (void)setRefreshing:(BOOL)refreshing
{ {
if (self.refreshing != refreshing) { if (_currentRefreshingState != refreshing) {
_currentRefreshingState = refreshing;
if (refreshing) { if (refreshing) {
// If it is the initial render, beginRefreshing will get called // If it is the initial render, beginRefreshing will get called
// in layoutSubviews. // in layoutSubviews.
@ -122,6 +126,8 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
- (void)refreshControlValueChanged - (void)refreshControlValueChanged
{ {
_currentRefreshingState = super.refreshing;
if (_onRefresh) { if (_onRefresh) {
_onRefresh(nil); _onRefresh(nil);
} }