【问题标题】:Navigate when clicking on image doesn't work单击图像时导航不起作用
【发布时间】:2019-09-24 04:47:04
【问题描述】:

我一直在尝试通过单击代码中的图像来更改屏幕,但它不起作用。

我尝试定义 Push、navigate 和其他道具,但它总是说 undefined 不是对象并显示道具。

import React from 'react';
import { AppRegistry, StyleSheet, View, Image, TouchableOpacity, Button } from "react-native";
import { widthPercentageToDP as wp, heightPercentageToDP as hp } from 'react-native-responsive-screen'
import { StackNavigator, createStackNavigator, createAppContainer } from 'react-navigation';
import Screen from './Screen'

export default class Additional extends React.Component {
  render(){
    const { navigate } = this.props.navigation;
    return (
      <View style={styles.container}>
        <TouchableOpacity onPress={() =>
          navigate("Screen")}
        >
          <Image
            style={{
              tintColor: "#9B9B9B", height: 56, width: 56,
              position: 'absolute', alignSelf: 'center', top: wp('-84.0%'), left: wp('5%'),
            }}
            source={require("../Icons/XButton.png")}
          />
        </TouchableOpacity>
      </View>
    )
  }
}

const AppNavigator = createStackNavigator({
  Home: {screen: Home},
  Screen: {screen: Screen},
}, {
  initialRouteName: 'Home',
});

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
  }
})

【问题讨论】:

  • 您是否进行了测试以确保navigate 不是undefined?从您的代码中不清楚 Additional 与堆栈导航器的关系。
  • @MikeM 好吧,附加文件是一张图片,点击后会将我带到屏幕。我已经运行了该应用程序,如果我多次单击该图标,它会给我提到“未定义不是对象”的错误。如果我可以运行任何其他测试,请告诉
  • 如果Additional 只是图像(而不是屏幕),那么除非您明确传递它们,否则它无法访问导航道具。
  • 所以你需要像&lt;Additional navigation=this.props.navigation /&gt;一样从父屏幕调用它。
  • @MikeM 我已经将它添加到它说导航不是变量的父级,所以我写了 const {navigate} = this.props.navigation 它给了我另一个未定义对象的错误。因此,我决定将“this.props.navigation”添加到父级的父级并且屏幕可以正常工作,但是当我单击图标时,它只会显示不透明度并且不会导航到屏幕,保持在同一页面上

标签: react-native routing navigation frontend react-navigation


【解决方案1】:

家长:

mport React from 'react';
import {AppRegistry, StyleSheet, View, Image, TouchableHighlight} from "react-native" ;
import {widthPercentageToDP as wp, heightPercentageToDP as hp} from 'react-native-responsive-screen'
import Additional from './Additional'
import { createAppContainer, createStackNavigator, StackActions, NavigationActions } from 'react-navigation'; // Version can be specified in package.json
import Screen from './Screen'

export default class SideBar extends React.Component {
    render() {
        return(

        <View style={styles.container}>



        <Additional navigation={this.props.navigation} />


                 </View>
        ) 
    }
}


const AppNavigator = createStackNavigator({
Home: {
    screen: Map,
  },
  Screen: {
    screen: Screen,
  },
}, {

});


const styles= StyleSheet.create({
    container:{ 
         flex: 1,
        backgroundColor: 'rgba(255, 255, 255, 0.81)',
       left: wp('75%'),
        width: 100,


}})

祖父母:

import React, {Component} from 'react';
import {AppRegistry, Platform, StyleSheet, Text, View, Dimensions} from 'react-native';
import MapView, {Marker} from 'react-native-maps';
import MenuButton from './MenuButton'
import SideBar from './SideBar'





const {width, height} = Dimensions.get ('window')

const SCREEN_HEIGHT = height
const SCREEN_WIDTH = width
const ASPECT_RATIO = height / width
const LATITUDE_DELTA = 0.0922
const LONGITUDE_DELTA = LATITUDE_DELTA * ASPECT_RATIO
export default class App extends Component {

constructor (props) {
super(props)
this.state ={
  initialPosition: {
latitude: 0,
longitude: 0,
latitudeDelta: 0,
longitudeDelta: 0

  },
  markerPosition: {
    latitude: 0,
    longitude: 0
  }
}
  }

watchID: ?number = null

componentDidMount(){

  navigator.geolocation.getCurrentPosition ((position) =>{
var lat = parseFloat(position.coords.latitude)
var long = parseFloat(position.coords.longitude)

var initialRegion = {

latitude : lat,
longitude: long,
latitudeDelta : LATITUDE_DELTA,
longitudeDelta : LONGITUDE_DELTA

}
this.setState({initialPosition: initialRegion})
this.setState({markerPosition: initialRegion})
  },
 (error) => alert (JSON.stringify(error)),
 {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000})

 this.watchID = navigator.geolocation.watchPosition((position) => {
var lat = parseFloat(position.coords.latitude)
var long = parseFloat(position.coords.longitude)

var lastRegion = {
  latitude: lat,
longitude: long,
latitudeDelta : LATITUDE_DELTA,
longitudeDelta : LONGITUDE_DELTA
}
this.setState({initialPosition: lastRegion})
this.setState({markerPosition: lastRegion})

}

 )}


componentWillUnmount(){
   navigator.geolocation.clearWatch(this.watchID)
 }



render() {
    return (
        <View style = {styles.container}>

      <MapView
       customMapStyle={mapStyle}
        style={styles.map}
        region={this.state.initialPosition}>


      <MapView.Marker
     coordinate= {this.state.markerPosition}>
     <View style = {styles.radius}>
       <View style = {styles.marker}>

       </View>
        </View>
     </MapView.Marker>
      </ MapView>
      <SideBar navigation= {this.props.navigation}/>
      <View style={styles.Mstyle}>
<MenuButton navigation= {this.props.navigation}/>
      </View>


</View>
    )

  }
}


const styles = StyleSheet.create({

 radius: {
height: 50,
width: 50,
borderRadius: 50/2,
overflow: 'hidden',
backgroundColor: 'rgba(0, 122, 255, 0.1)',
borderWidth: 1,
borderColor: 'rgba(0, 122, 255, 0.3)',
alignItems: 'center',
justifyContent: 'center'
  },
marker: {

 height: 20,
 width: 20,
 borderWidth: 3,
 borderColor: 'white',
 borderRadius: 20 / 2,
overflow: 'hidden',
backgroundColor: '#007AFF'
},


 Mstyle: {
      alignSelf:'center',
      position: 'absolute'
},

 container: {
  flex: 1,
  justifyContent: 'center',

  backgroundColor: '#F5FCFF'

 },
 map: {
  left: 0,
  right: 0,
  top: 0,
  bottom: 0,
  position: 'absolute'
 },

});


 AppRegistry.registerComponent('mapsTutorial', ()=> mapsTutorial);

【讨论】:

    【解决方案2】:

    因为Additional 不在createStackNavigator 屏幕列表中。所以,this.props.navigationundefined。 为了解决这个问题,首先,您必须使用 export default AppNavigator ,并且在另一个组件中(例如 Additional)您必须使用 withNavigation 方法。

    在根组件中:

    export default createStackNavigator({
      Home: {screen: Home},
      Screen: {screen: Screen},
    }, {
      initialRouteName: 'Home',
    });
    

    在附加组件中:

    import {withNavigation} from 'react-navigation'
    
    class Additional extends React.Component {
      // ...
    }
    
    export default withNavigation(Additional)
    

    【讨论】:

    • 感谢您的回复,我尝试在 root 和其他组件中导出前面提到的 createStackNavigator 以进行尝试,但它不起作用。是否有其他方法可以解决它,或者最好我们进行实时聊天,以便我可以向您展示代码并且我们可以处理它?谢谢
    • 是的,你有Skype或slack吗?
    • 是的。请给我你的 Skype id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多