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:
parent
7851572b40
commit
93b39b7326
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue