反应原生的请求孤立的任务 - 这是什么意思?

jsd*_*rio 13 javascript reactjs react-native

我正在尝试使用按钮和其他操作为瓷砖构建网格系统.我试着使用本机操场网格图像源,你可以在这里找到.添加zIndex到单个图片时,它会产生以下"堆栈跟踪"和错误.永远不会描绘图像.

在此输入图像描述

如果您感兴趣,这是我正在使用的确切组件:

export default class GridLayout extends Component {
  constructor () {
    super()
    const { width, height } = Dimensions.get('window')
    this.state = {
      currentScreenWidth: width,
      currentScreenHeight: height
    }
  }

  handleRotation (event) {
    var layout = event.nativeEvent.layout
    this.setState({ currentScreenWidth: layout.width, currentScreenHeight: layout.height })
  }

  calculatedSize () {
    var size = this.state.currentScreenWidth / IMAGES_PER_ROW
    return { width: size, height: size }
  }

  renderRow (images) {
    return images.map((uri, i) => {
      return (
        <Image key={i} style={[styles.image, this.calculatedSize()]} source={{uri: uri}} />
      )
    })
  }

  renderImagesInGroupsOf (count) {
    return _.chunk(IMAGE_URLS, IMAGES_PER_ROW).map((imagesForRow) => {
      console.log('row being painted')
      return (
        <View key={uuid.v4()} style={styles.row}>
          {this.renderRow(imagesForRow)}
        </View>
      )
    })
  }

  render () {
    return (
      <ScrollView style={styles.grid} onLayout={(ev) => this.handleRotation(ev)} contentContainerStyle={styles.scrollView}>
        {this.renderImagesInGroupsOf(IMAGES_PER_ROW)}
      </ScrollView>
    )
  }
}

var styles = StyleSheet.create({

  grid: {
    flex: 1,
    backgroundColor: 'blue'
  },

  row: {
    flexDirection: 'row',
    alignItems: 'center',
    justifyContent: 'flex-start',
    backgroundColor: 'magenta'
  },

  image: {
    zIndex: 2000
  }
})
Run Code Online (Sandbox Code Playgroud)

Jas*_*are 7

它可能与您渲染的方式有关。您的请求似乎卡住了。看起来这是在RN中抛出错误的代码(来自RCTImageLoader.m):

// Remove completed tasks
for (RCTNetworkTask *task in _pendingTasks.reverseObjectEnumerator) {
  switch (task.status) {
    case RCTNetworkTaskFinished:
      [_pendingTasks removeObject:task];
      _activeTasks--;
      break;
    case RCTNetworkTaskPending:
      break;
    case RCTNetworkTaskInProgress:
      // Check task isn't "stuck"
      if (task.requestToken == nil) {
        RCTLogWarn(@"Task orphaned for request %@", task.request);
        [_pendingTasks removeObject:task];
        _activeTasks--;
        [task cancel];
      }
      break;
  }
}
Run Code Online (Sandbox Code Playgroud)

我不确定如何解决这个问题,但有一些想法可以帮助您调试:

  1. <Image>组件具有一些函数和回调,您可以利用它们来尝试进一步追踪问题(onLoadonLoadEndonLoadStartonErroronProgress)。最后两个仅适用于 iOS,但您可以查看是否调用了其中的任何一个以查看过程中的哪个位置挂断了。

  2. 或者,我这样做的方法是使用 ListView 并将图像 url 放置在 ListView 的datasource道具中(使用该_.chunk方法将它们分组,就像您已经做的那样)。这将是一种更简洁的呈现它们的方式 IMO