Я закончил использовать обходной путь, обернув FlatList в ScrollView, и оставил refreshControl для ScrollView.
const { fetchingMore, onFetchMore } = this.props;
return <ScrollView
contentContainerStyle={{
flexDirection: 'row',
alignSelf: 'flex-end',
flexGrow: 1
}}
refreshControl={<RefreshControl refreshing={fetchingMore} onRefresh={onFetchMore} />}
>
<FlatList
inverted
style={styles.list}
data={messages}
keyExtractor={this.extractItemKey}
renderItem={this.renderItem}
/>
</ScrollView>
Обратите внимание, что важно иметь стиль flexGrow: 1
в scrollView, иначе FlatList будет перетекать вверху прокрутки, когда он не заполнен.