this.props.route.params返回未定义的值



我正在构建一个条形码阅读器应用程序,该应用程序扫描qr码,然后获取数据,并用作从firebase获取对象的密钥。为了将数据用作密钥,我需要通过另一个屏幕,但当我检查控制台日志时,会发现扫描的密钥未定义。

本身的条形码扫描仪工作得很好。条形码类别:

export  class BarCodeScannerScreen extends Component{

state = {
CameraPermissionGranted: null,  
}
async componentDidMount() {
// Ask for camera permission
const { status } = await Permissions.askAsync(Permissions.CAMERA);
this.setState({ CameraPermissionGranted: status === "granted" ? true : false });


};

barCodeScanned = ({ data }) => {
//Access the Data

alert(data); // shows the scanned key
this.props.navigation.navigate('Info', {
item: data, }); // but then it's dissapears in here.

};
render(){

const { CameraPermissionGranted } = this.state;
if(CameraPermissionGranted === null){
// Request Permission
return(
<View style={styles.container}>
<Text>Please grant Camera permission</Text>
</View> 
);
}
if(CameraPermissionGranted === false){
// Permission denied
return ( 
<View style={styles.container}>
<Text>Camera Permission Denied.</Text>
</View> 
);
}
if(CameraPermissionGranted === true){
// Got the permission, time to scan
return (
<View style = {{
flex: 1,
justifyContent: 'center',
alignItems: 'center',
}}>
<BarCodeScanner
onBarCodeScanned = {this.barCodeScanned }
style = {{
height:  DEVICE_HEIGHT/1.1,
width: DEVICE_WIDTH,
}}
>
</BarCodeScanner>
</View>
);

}
}

}

这是我接收信息的信息屏幕:

export default class InfoScreen extends Component {

constructor(props){
super(props);
this.state={ 
productlist:[],
scannedkey: this.props.route.params.item

} }

async componentDidMount(){



firebase.database().ref(`product/${ this.state.scannedkey}`).on(
"value",
(snapshot) => {
var list = [];
snapshot.forEach((child) => {
list.push({
key: child.key,
title: child.val().title,
//details: child.val().details,
//price: child.val().price
});
});

this.setState({ productlist: list });
},
(error) => console.error(error)
);
}
componentWillUnmount() {
if (this.valuelistener_) {
this.valueRef_.off("value", this.valuelistener_)
}}

render() {
console.log(this.state.scannedkey); // console log shows that scanned key is undefined
return(
<View style={styles.container}>
<Text>Hey</Text>

<Text>{this.state.productlist.title}</Text>
</View>
);}}

App.js

export default function App() {
const Drawer=createDrawerNavigator();
return (
<Provider store={store}>
<NavigationContainer>
<Drawer.Navigator initialRouteName="Barcode">

<Drawer.Screen name="Barcode" component={BarCodeScannerScreen} />
<Drawer.Screen name="Info" component={InfoScreen} />

</Drawer.Navigator>

</NavigationContainer>
</Provider>

);
}

我通常使用函数组件来导航,但对于类组件,这对我来说有点棘手。也许我错过了什么?

到目前为止,我已经尝试过:

this.props.navigation.navigate('Info', {
item: JSON.stringify(data)  , });

但它没有起作用。我将感谢你的帮助。

尝试直接从道具中使用物品,而不是从状态中使用

在您的componentDidMount调用中,从state提供scannedKey,从props 提供

firebase.database().ref(`product/${this.props.route.params.item}`)....

你也在构造函数中直接在你的状态中调用this.props,而不是props构造函数可以直接访问它,这就是为什么你可以调用super(props(而不是super,这是不好的做法,我的朋友。

检查这个链接,在黄色的大纸条上我引用了什么https://reactjs.org/docs/react-component.html#constructor

最新更新