【发布时间】:2021-05-20 19:01:52
【问题描述】:
我对 React Native 非常陌生。我从来没有在论坛上发过帖子,如果格式不正确,请见谅。请多多包涵。当我使用异步存储一个值时,我写入控制台,所以我知道它正在存储该值,然后我读回该值并且当我从控制台读取时我知道它在那里,但它不会将我的单选按钮设置为使用异步存储的值。即使我知道数据已设置,这 4 行中的第一行也不起作用,但是如果我单独测试它们,3 条注释掉的行每行都可以正常工作,但这是我想要工作的第一行:
const [checked, setChecked] = useState(getData());
// const [checked, setChecked] = useState('first');
//const [checked, setChecked] = useState('second');
//const [checked, setChecked] = useState(params.startvalue);
这里是完整的代码:
import React, { useState , useEffect} from 'react';
import { Text, View, StyleSheet, Button } from 'react-native';
import Constants from 'expo-constants';
import AsyncStorage from '@react-native-async-storage/async-storage';
// or any pure javascript modules available in npm
import { RadioButton } from 'react-native-paper';
const storeData = async (value) => {
try {
console.log("in storeData value is-->" + value.toString());
await AsyncStorage.setItem('@storage_Key', value.toString())
} catch (e) {
console.log("didntwork in StoreData");
}
}
const getData = async () => {
try {
const value = await AsyncStorage.getItem('@storage_Key');
console.log("value in getData is:", value.toString());
return value != null ? value.toString() : null;
} catch (e) {
console.log("error in getData", { e });
}
}
const MyRadioButton = params => {
const [checked, setChecked] = useState(getData());
// const [checked, setChecked] = useState('first');
//const [checked, setChecked] = useState('second');
//const [checked, setChecked] = useState(params.startvalue);
return (
<View>
<Text>{params.startvalue}</Text>
<Text>{params.message1}
<RadioButton
value="first"
status={checked == 'first' ? 'checked' : 'unchecked'}
onPress={() => {
setChecked('first');
params.setxDisabled(true);
storeData('first');
}
}
/></Text>
<Text>{params.message2}
<RadioButton
value="second"
status={checked == 'second' ? 'checked' : 'unchecked'}
onPress={() => {
setChecked('second');
params.setxDisabled(false);
storeData('second');
}
}
/></Text>
</View>
);
};
export default function App() {
const [xdisabled, setxDisabled] = useState(true);
return (
<View style={styles.container}>
<Text style={styles.auto} >Welcome </Text>
<Text style={styles.auto} >Blah Blahhhh</Text>
<MyRadioButton message1="I do NOT agree to the terms" message2="I agree to the terms" setxDisabled={setxDisabled} startvalue="first" />
<Button title="continue" disabled={xdisabled} onPress={() => navigation.navigate('Home')} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
paddingTop: Constants.statusBarHeight,
backgroundColor: '#ecf0f1',
padding: 8,
},
paragraph: {
margin: 24,
fontSize: 18,
fontWeight: 'bold',
textAlign: 'center',
},
});
【问题讨论】:
-
您正在尝试使用 const [checked, setChecked] = useState(getData()); 中的异步函数返回的值来设置状态你不能那样设置你的状态,因为它只返回一个 Promise。我建议您获取有关异步 JS 工作原理的更多信息。