FlatList React Native 0.60 Android空白并冻结

时间:2019-09-24 23:35:55

标签: android react-native react-native-flatlist

最终更新

我在回答自己的问题。请参阅下面的答案。

更新更新

即使我用this.state.updating解决了问题后,仍然没有运气。显然,这里有多个问题。

更新

事实证明,我重用了为早期应用编写的一些旧FlatList代码,而没有重用对this.state.updating的其他引用,这就是我指向extraData的目的。所以我实际上是在将extraData指向无。关于为什么这只能阻止FlatList在高于0.60.0的版本上使用React Native在Android中进行渲染的最佳猜测:在Android上,React Native 0.60.0和更高版本的速度稍慢,因此我无法如此快地获取数据。这可能意味着在我获取数据之前渲染的页面,并且如果状态保持为浅等于水平,则FlatList不会重新渲染,因此它从不显示任何数据。如果为this.state.updating添加代码不起作用,我将对其进行进一步编辑,但我认为这是问题所在。

原始帖子

我有一个FlatList在React Native> = 0.60.0中在Android中不起作用,但在所有其他情况下都起作用。低于0.60.0的东西在两个平台上都可以,而IOS的任何东西都可以。在使用RN 0.60.0或更高版本的RN中,FlatList始终为空,有时会冻结该应用程序,即使我可以看到控制台中的数据输入正确。这不仅适用于HER 0.60.1中包含的hermes,因为在引入hermes之前,我也遇到了版本问题。在RN 0.59.9上,我没有这个问题,但是坚持59不是长期解决方案。我查看了RN更新日志,但似乎无法弄清问题所在。这是我的代码:

<FlatList
 style={styles.listStyle}
 bounces={false}
 refreshControl={
 <RefreshControl
 refreshing={this.state.refreshing}
 onRefresh={this._onRefresh}
 />
 }

 data={this.state.notices}
 keyExtractor={item => item.id}
 initialNumToRender={8}
 maxToRenderPerBatch={2}
 updateCellsBatchingPeriod={100}
 onEndReachedThreshold={0.5}
 removeClippedSubviews={true}
 windowSize={7}
 extraData={this.state.updating}

 onEndReached={this._onEndList}

 ListFooterComponent={this.renderFooter}
 renderItem={({ item }) => (
 <View style={styles.hidingOverflow}>
 {this.state.loading === false &&     <TouchableOpacity
 style={styles.myBackGround}
 onPress={() =>

 this.props.navigation.navigate('NoticeDetailScreen', {
 noticeDetail: item,
 database: databasenum,
 threshold: thresholdnum
})} title="Details"
key={item.id} style={styles.myCardStyle}>

  <View style={styles.myLayout}>

    <View style={styles.myPhotoContainer}>

    {item.triggerPhotos.length>0 &&
      <View
        style={styles.alertImgContainer}
      >
        <Image source={{ uri: not shown for purposes of this post }} style={styles.alertImg} />
      </View>
    }

    </View>

<View style={styles.listText}>

  <View style={styles.hiddingOverflow}>
    <View style={styles.hiddingOverflow}>
      {item.name !== null &&  <Text style={styles.titleText}>Name: {item.name}</Text>}
      </View>
  </View>
  {item.updated !== null &&
  <Text style={styles.detailsText}>Updated: { item.updated }</Text>}
  {item.score !== null &&
  <Text style={styles.detailsText}>Top Score: { item.score.toFixed(2) }</Text>}
</View>


<View>
<Text></Text>
</View>

  </View>
  </TouchableOpacity>}
  </View>
  )}
  />

我知道这与升级RN应用程序无关,因为我创建了一个新版本而不是更新旧版本。还有其他人处理过吗?谢谢!

编辑:我还应该注意,FlatList在调试期间或使用react-native log-android的控制台中不会在黄色框中触发任何错误消息。

1 个答案:

答案 0 :(得分:0)

好的,抱歉,没有其他人可以回答这个问题,因为我没有发布样式表,而这与样式表有关。我没有想到这一点,否则我会将其添加到原始问题中。所以这是答案:

显然,在FlatList(或任何其他组件)内同时具有flex:1的项与位于其上的页面同时具有flex:1的主视图(如果您使用RN的话,包含所有内容的主视图)也不是一件好事或高于0.60.0(在Android上)。在任何平台上,RN在0.60.0以下都可以,并且在IOS中使用任何版本的RN都可以。在Android上,RN> = 0.60.0时,该组件只会短暂出现,然后消失,或者根本不显示。但是,它不会给您任何错误消息。