Реагируйте на встроенную функцию Нажмите Touchableopacity или TouchableHighlight не работает должным образом на некоторых экранах телефонов - PullRequest
0 голосов
/ 03 мая 2020

Я создаю приложение, в котором у меня есть вид с кастомной печатью на отдельных его дочерних элементах. Итак, я обертываю и компоненты с основным представлением, с несколькими кнопками и TouchableOpacity / TouchableHighlight.

Это работает правильно, но на некоторых мобильных экранах событие onPress не запускается.

Я даже проверил, есть ли проблема с позицией Абсолют, но я не использую ни одного из них. Кроме того, поскольку у меня нет нескольких мобильных экранов для отладки, я не могу просто использовать метод проб и ошибок для проверки правильности реализации.

На данный момент в Nokia 6 и MI Pocco f1 onPress в не запускается.

PS - я добавил цвет фона только для справки.

Здесь-

  1. Серый (#aaa) - оболочка для основного списка товаров.
  2. Зелёный и жёлтый - двое детей главной оболочки. (Просмотр).
  3. Красный и оранжевый - два дочерних элемента оболочки Green View, где красный означает TouchableOpacity / TouchableHighlight, а оранжевый - сборщик
  4. Синий является дочерним элементом кнопки желтой оболочки.

Кроме того, у меня есть события onPress для компонентов фона Красный, Оранжевый и Синий

Надеюсь, моя проблема понятна всем.

Любая помощь будет по достоинству оценена.

Заранее спасибо.

Для получения дополнительной информации я добавил кодовую базу обертки продукта (серый - # aaa ) -

<View
  style={[
    mainStyles.row,
    {
      flex: 1,
      marginBottom: 10,
      paddingLeft: 10,
      paddingRight: 10,
      backgroundColor: '#aaa',
    },
  ]}>
  <View
    style={[
      {
        flex: 2,
        justifyContent: 'center',
        marginTop: 10,
        marginRight: 25,
        backgroundColor: 'green',
        padding: 3,
      },
    ]}>
    <TouchableHighlight
      underlayColor="#eee"
      style={{backgroundColor: 'red'}}
      onPress={() => {
        this.props.navigation.navigate('product-detail-screen', {
          productId: product._id,
        });
      }}>
      <View style={{flexDirection: 'row'}}>
        <View style={{flex: 2}}>
          <Text style={{fontSize: 20}}>{product.root.name}</Text>
        </View>
        <View
          style={[
            {
              flex: 1,
              justifyContent: 'center',
              alignItems: 'flex-end',
            },
          ]}>
          <Icon
            type="font-awesome"
            name="chevron-right"
            size={20}
            color="#a5a5a5"
          />
        </View>
      </View>
    </TouchableHighlight>
    <Picker
      selectedValue={
        this.state.productVariantForPicker.filter(
          variant => variant.productId === product._id,
        )[0].value
      }
      style={{
        height: 40,
        width: 'auto',
        marginTop: 10,
        backgroundColor: 'orange',
      }}
      onValueChange={(itemValue, itemIndex) => {
        // * AWESOME LOGIC TO CHANGE THE VARIANT PICKER ;)
        let productIndex = null;
        this.state.productVariantForPicker.forEach((variant, i) => {
          if (product._id === variant.productId) {
            productIndex = i;
          }
        });
        let tempProductVariantForPicker = this.state.productVariantForPicker;
        tempProductVariantForPicker[productIndex].value = itemValue;
        tempProductVariantForPicker[productIndex].variantId =
          product.variants[itemIndex]._id;
        this.setState({
          productVariantForPicker: tempProductVariantForPicker,
        });
      }}>
      {product.variants.map((variant, index) => (
        <Picker.Item
          key={index}
          label={`${variant.value}/₹ ${variant.price}`}
          value={variant.value}
        />
      ))}
    </Picker>
  </View>
  <View
    style={[
      {
        flex: 1,
        justifyContent: 'center',
        marginLeft: 5,
        backgroundColor: 'yellow',
      },
    ]}>
    {this.props.cart.cart ? (
      // * AWESOME LOGIC OF DISPLAYING BUTTONS BASED ON VARIANTS ADDED IN CART
      !this.props.cart.cart.products.filter(
        cartProduct =>
          cartProduct.variantId ===
          this.state.productVariantForPicker.filter(
            variant => variant.productId === product._id,
          )[0].variantId,
      )[0] ? (
        <View style={{alignItems: 'center', backgroundColor: 'blue'}}>
          <Button
            title="Add to cart"
            type="outline"
            buttonStyle={[
              styles.btn,
              mainStyles.outlineBtn,
              {width: '100%', padding: 5},
            ]}
            loading={this.props.cart.cart.updatingCart}
            onPress={this.addToCart.bind(null, product._id)}
            titleStyle={{color: variables.mainThemeColor}}
          />
        </View>
      ) : (
        <View
          style={[mainStyles.row, {marginTop: 15, backgroundColor: 'blue'}]}>
          <View style={{flex: 1, justifyContent: 'center'}}>
            <Button
              title="-"
              titleStyle={{
                fontSize: 20,
                fontWeight: 'bold',
                color: variables.mainThemeColor,
              }}
              type="outline"
              buttonStyle={[
                styles.btn,
                mainStyles.outlineBtn,
                {padding: 2, width: '100%', minHeight: 35},
              ]}
              loading={this.props.cart.cart.updatingCart}
              onPress={this.changeProductQuantityinCart.bind(
                null,
                'decrement',
                this.state.productVariantForPicker.filter(
                  variant => variant.productId === product._id,
                )[0],
              )}
            />
          </View>
          <View
            style={{
              flex: 1,
              justifyContent: 'center',
              alignItems: 'center',
            }}>
            <Text style={{fontSize: 18}}>
              {
                this.props.cart.cart.products.filter(
                  cartProduct =>
                    cartProduct.variantId ===
                    this.state.productVariantForPicker.filter(
                      variant => variant.productId === product._id,
                    )[0].variantId,
                )[0].quantity
              }
            </Text>
          </View>
          <View style={{flex: 1}}>
            <Button
              title="+"
              titleStyle={{
                fontSize: 20,
                fontWeight: 'bold',
                color: variables.mainThemeColor,
              }}
              type="outline"
              buttonStyle={[
                styles.btn,
                mainStyles.outlineBtn,
                {padding: 2, width: '100%', minHeight: 35},
              ]}
              loading={this.props.cart.cart.updatingCart}
              onPress={this.changeProductQuantityinCart.bind(
                null,
                'increment',
                this.state.productVariantForPicker.filter(
                  variant => variant.productId === product._id,
                )[0],
              )}
            />
          </View>
        </View>
      )
    ) : (
      // * Display this at initial, if cart is empty
      <View style={{alignItems: 'center'}}>
        <Button
          type="outline"
          buttonStyle={styles.btn}
          title="Add to cart"
          onPress={this.addToCart.bind(null, product._id)}
          titleStyle={{color: variables.mainThemeColor}}
        />
      </View>
    )}
  </View>
</View>;

PS- Добавление скриншотов экранов для большей наглядности.

Actual screen Screen with background color for debugging

...