简体   繁体   中英

TouchableWithoutFeedback never fires touch events

I have the following React-Native code which alerts the user that it was pressed, however it does not respond to anything.

I have tried using different Touchable components but none seem to work, the only one is Button but that's not really what I want, I'm building a slider so a button is not really appropriate for this.

Anyway, here's my code:

import React, {Component} from 'react';
import {View, TouchableWithoutFeedback, Alert, Text} from 'react-native';
import styles from './styles.js';
import LinearGradient from 'react-native-linear-gradient';

export default class BrightnessSlider extends Component {
    value: 100;

    constructor(...args) {
        super(...args);
    }

    render() {
        return (
            <LinearGradient start={{x: 0, y: 0}} end={{x: 1, y: 0}} colors={["#222", "#ddd"]} style={styles.brightnessSliderRunnable}>
                <View style={styles.brightnessSliderTrack}>
                    <TouchableWithoutFeedback onPress={() => Alert.alert("Hello World")}>
                        <View style={styles.brightnessSliderThumb} />
                    </TouchableWithoutFeedback>
                </View>
            </LinearGradient>
        )
    }
}

and ./styles.js

import {StyleSheet} from "react-native";

export default styles = StyleSheet.create({
    brightnessSliderRunnable: {
        top: 50,
        height: 9,
        width: width - 20,
        left: 10,
        backgroundColor: "#555",
        opacity: 1,
        elevation: 1,
        borderWidth: 0
        // position: "absolute"

    },
    brightnessSliderThumb: {
        width: 23,
        height: 23,
        borderColor: "#888",
        // opacity: 1,
        borderWidth: 2,
        backgroundColor: "#ffffff",
        position: "absolute",
        top: -7,
        borderRadius: 5,
        elevation: 2
    },
    brightnessSliderTrack: {
        width: "100%",
        elevation: 1,
        borderWidth: 0
    }
});

Thanks for any help

Questioner's original code .

Solution

Added by questioner's solution.


Change position: absolute to position: relative .


Change your style type made by StyleSheet as below.

Your original.

{...styles.colourContainer, opacity: 100 - this.darkness}

Recommend way.

[styles.colourContainer, {opacity: 100 - this.darkness}]

I tested code and it works well when we touch the white square.

Tested on iOS.

在此处输入图片说明

Original App.js .

App.js changed by me.

 import React, {Component} from 'react'; import {View, Dimensions, Text} from 'react-native'; import BrightnessSlider from '../components/BrightnessSlider'; import styles from '../components/TempStyle.js'; const d = Dimensions.get('window'), width = d.width, height = d.height; export default class BrightnessSliderTest extends Component { constructor(...args) { super(...args); this.darkness = 0; this.prevColours = ["#ff0000", "#00ff00", "#0000ff"]; } render() { // It is not possible just access the style created by StyleSheet.create(). Do not use StyleSheet.create() or change to flatten the StyleSheet object. const sty = [styles.colourContainer,{ opacity: 100 - this.darkness}]; return ( <View style={styles.container}> <View style={sty}> <View style={styles.toolBar}> <View style={styles.colourPalette}> {this.prevColours.map((i, a) => <View key={String(a)} style={[styles.colourTile, {backgroundColor: i}]}/>)} </View> {/* <Button title={"Save To Palette"} onTap={this.saveToPalette}>Save</Button> */} </View> <BrightnessSlider /> </View> </View> ); } } 

Why?

I am not sure how you can use your component in other components. But if you do not have container having enough size can show your component, touch area may not work. That is why I use backgroundColor for container sometimes in testing.


Added after testing full code used in question.

It is not possible just access the style through like spread operator created by StyleSheet.create(). Do not use StyleSheet.create() or change to flatten the StyleSheet object.

And Style can be worked differently from platforms(iOS, Android).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM