undefined 不是对象(评估 '_props[registrationName]')

undefined is not and object (evaluating '_props[registrationName]')

本机反应:0.43.3

问题只出现在Android系统,iOS没问题。 当我触摸一个 TouchableOpacity 组件时,onTouch 函数不会被执行。

有人发现这个问题吗?

我用 RN 建立了一个日历。问题是,当我在 Android 设备或​​模拟器上单击 Day 单位时,我会收到错误 undefined is not and object (evaluating '_props[registrationName]')。但是在 iOS 设备和模拟器上点击它是可以的。 Day组件的代码是这样的:

        <TouchableOpacity style={styles.calendarRowUnit} onPress={() => this.props.onSelect(this.props.date)}>
            <View style={dateWrapperStyle}>
                <Text style={dateTextStyle}>{dateString}</Text>
            </View>
        </TouchableOpacity>

以及错误图片: error info iamge

我发现只有在触摸文本区域时才会出现错误。 我不知道这是本机错误还是我的错。在我将 react-native 版本更新到 0.43.3 之前,这个错误从未发生过。

/**
   * @param {object} inst The instance, which is the source of events.
   * @param {string} registrationName Name of listener (e.g. `onClick`).
   * @return {?function} The stored callback.
   */
  getListener: function(inst, registrationName) {
    var listener;

    // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
    // live here; needs to be moved to a better place soon
    if (typeof inst.tag === 'number') {
      const props = EventPluginUtils.getFiberCurrentPropsFromNode(
        inst.stateNode
      );
      if (!props) {
        // Work in progress.
        return null;
      }
      listener = props[registrationName];
      if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
        return null;
      }
    } else {
      if (typeof inst._currentElement === 'string') {
        // Text node, let it bubble through.
        return null;
      }
      if (!inst._rootNodeID) {
        // If the instance is already unmounted, we have no listeners.
        return null;
      }
      const props = inst._currentElement.props;
      listener = props[registrationName];
      if (shouldPreventMouseEvent(registrationName, inst._currentElement.type, props)) {
        return null;
      }
    }

    invariant(
      !listener || typeof listener === 'function',
      'Expected %s listener to be a function, instead got type %s',
      registrationName,
      typeof listener
    );
    return listener;
  },

目前有一个错误,如果 TouchableOpacity 中的 Text 有一个 number,它会出错。目前修复它的方法是将 number 转换为 string,它将触发字符串检查并适当地抛出一个空值。

前:

之前:<Text>16</Text> 之后:<Text>String(16)</Text>

#12905 <Text /> 中存在错误,此错误是 RN 0 特有的。43.x 并已在更高版本中修复。错误是,只要 <Text /> 中有数字,就会导致此错误。 解决办法是:

  1. 使用最新版本升级 React Native。
  2. 将值类型转换为 string

例如,

  • <Text> {100} </Text><Text> {''100} </Text>
  • <Text> {100} </Text><Text> {String(100)} </Text>
  • <Text> {100} </Text><Text> {(100).toString} </Text>