React-Native:上拉时未调用 FlatList onRefresh。

Posted

技术标签:

【中文标题】React-Native:上拉时未调用 FlatList onRefresh。【英文标题】:React-Native: FlatList onRefresh not called on pull up. 【发布时间】:2017-11-30 23:14:22 【问题描述】:

当前行为:

我正在尝试通过拉起视图来更新从服务器获取的列表。当我这样做时,onRefresh 不会触发。

我在 setState 函数的回调中设置了 GET 请求,但这似乎没有任何作用。

预期行为:

上拉视图调用 onRefresh 函数。

代码:

...
  constructor(props) 
    super(props);
    this.state = 
      stories: [],
      isFetching: false,
    ;
  
  componentDidMount()  this.fetchData() 
  onRefresh() 
    this.setState( isFetching: true , function()  this.fetchData() );
  
  fetchData() 
    var that = this;
    axios.get('http://192.168.0.13:3000/api/story/get/by/geo')
      .then((res) => 
        that.setState( stories: res.data, isFetching: false );
        that.props.dispatch(StoryActions.setStories(res.data))
      )
  
  render() 
    return (
      <ScrollView>
        <FlatList
          onRefresh=() => this.onRefresh()
          refreshing=this.state.isFetching
          data=this.state.stories
          keyExtractor=(item, index) => item.id
          renderItem=(item) => (<StoryFeed story=item id=item.id /> )
          />
      </ScrollView>
    )
  

版本信息

反应原生:0.45.0

节点:7.4.0

【问题讨论】:

我认为onRefresh 是错误的放置位置。为什么不把它贴在render() 中呢?也许我误解了,但在我看来,使用这样的刷新功能有点违背功能代码的全部目的...... 根据文档 (facebook.github.io/react-native/docs/flatlist.html) onRefresh 是 Fl​​atList 的一个属性。不知道你会如何渲染。 这很好,但我认为onRefresh 不会在您认为它会被调用时被调用。在函数式编程中,例如带有 React+Redux 的 JS6,您不会更改状态,而是创建一个新状态。您的状态树没有改变,因此没有创建新的状态。 尝试在控制台刷新一些东西,我想你会发现它永远不会在你当前的代码中被击中。 【参考方案1】:

评论因为这在我的搜索中在 google bing 上排名很高。

在我的例子中,另一个 FlatList 的行为与我想要的不完全一致(它似乎没有“onRefresh”):

import  FlatList  from 'react-native-gesture-handler';

我真正想要的:

import  FlatList  from 'react-native';

现在来调查我们为什么会有这种依赖关系。 ;)

【讨论】:

这是 VSCode 为我生成的导入;我看的不够仔细,浪费了大约 15 分钟的时间去追逐它,直到我找到了这个。谢谢你的回答! 啊。同样在这里!谢谢 值得注意的是import FlatList from 'react-native-gesture-handler'; 将在iOS 上工作,但在android 上无效 无法告诉您我遇到了多少次错误并发现这是因为我从“react-native-gesture-handler”自动导入。感谢您的回答!【参考方案2】:

React-Native 的问题。嵌套在 ScrollView 中时,FlatList 似乎没有检测到 onRefresh:问题票:https://github.com/facebook/react-native/issues/14756

【讨论】:

【参考方案3】:

我遇到过这个问题。有时IDE 在自动完成代码中选择错误的Flatlist 组件。 IDE 考虑 react-native-gesture-handler 的 Flatlist。不支持Flatlist 中的react-native-gesture-handler onRefreshreact-nativeFlatlist 只支持onRefresh

所以需要更改react-nativeFlatlist 组件。

【讨论】:

【参考方案4】:

我也遇到了同样的问题。通过将 refreshControl 属性添加到 Flatlist 的父组件(即 Content 或 Scrollview) 来解决它,如下所示:

import  StyleSheet, RefreshControl  from 'react-native';

 refreshControl=
          <RefreshControl
            refreshing=this.state.isRefreshing
            onRefresh=() => this.handleRefresh()
          />
        

...

【讨论】:

【参考方案5】:

您可能正在使用 RefreshControl 作为 ScrollView 中的道具: Example and Guide

【讨论】:

点评来源: 嗨,虽然链接是分享知识的好方法,但如果它们将来被破坏,它们将不会真正回答问题。将回答问题的链接的基本内容添加到您的答案中。如果内容太复杂或太大而无法在此处放置,请描述所提出解决方案的总体思路。请记住始终保留对原始解决方案网站的链接引用。见:How do I write a good answer?【参考方案6】:

这个问题我也有一段时间了。我在this expo 示例中找到了解决方案。

这是该示例的 sn-p:

return (
      <ScrollView>
        <FlatList
          onRefresh=() => this.onRefresh()
          refreshing=this.state.isFetching
          data=this.state.stories
          keyExtractor=(item, index) => item.id
          renderItem=(item) => (<StoryFeed story=item id=item.id /> )
          />
      </ScrollView>
    )

【讨论】:

以上是关于React-Native:上拉时未调用 FlatList onRefresh。的主要内容,如果未能解决你的问题,请参考以下文章

React-native node.js 显示错误:多部分:使用 react-native-image-picker 上传图像时未找到边界

微信H5单页面滑动的时候如何避免出界,出现头部和底部的黑底?

浅谈XListView的使用

React-native ScrollView 上拉加载和下拉刷新

当多人推/拉时 Git 权限正在改变

尝试启动 Atom/Nuclide 时未找到流