所以我在Udemy上做了一个基本的反应原生课程(没有来自教练的反应)。第一个任务是制作一个“To-Do”列表,我做了。按照此页面上的所有说明操作: https://facebook.github.io/react-native/docs/signed-apk-android.html 有一个成功的构建,我的应用程序在安装后启动,但当我按下输入字段时,它只是崩溃。知道什么可能是错的吗? 这是我的代码,尽管我很确定问题出在其他地方:
import React, {Component} from 'react';
import {
StyleSheet,
Text,
TextInput,
View,
TouchableOpacity,
ScrollView,
AsyncStorage
} from 'react-native';
const Main = React.createClass({
getInitialState () {
return ({
tasks: [],
completedTasks:[],
task:''
})
},
componentWillMount() {
AsyncStorage.getItem('tasks')
.then((response) => {
this.setState ({tasks: JSON.parse(response)})
});
AsyncStorage.getItem('completedTasks')
.then((response) => {
this.setState({completedTasks: JSON.parse(response)})
});
},
componentDidUpdate() {
this.setStorage();
},
setStorage() {
AsyncStorage.setItem('tasks', JSON.stringify(this.state.tasks));
AsyncStorage.setItem('completedTasks', JSON.stringify(this.state.completedTasks));
},
renderList(tasks){
return(
tasks.map((task, index) =>{
return(
<View key={task} style={styles.task}>
<Text>
{task}
</Text>
<TouchableOpacity
onPress={()=>this.completeTask(index)}
>
<Text>
✓
</Text>
</TouchableOpacity>
</View>
)
})
)
},
renderCompleted(tasks) {
return (
tasks.map((task, index) => {
return(
<View key={task} style={styles.task}>
<Text style={styles.completed}>
{task}
</Text>
<TouchableOpacity
onPress={()=>this.deleteTask(index)}
>
<Text>
✕
</Text>
</TouchableOpacity>
</View>
)
})
)
},
deleteTask(index){
let completedTasks = this.state.completedTasks;
completedTasks = completedTasks.slice(0, index).concat(completedTasks.slice(index+1));
this.setState({completedTasks});
},
completeTask(index) {
let tasks = this.state.tasks;
tasks = tasks.slice(0, index).concat(tasks.slice(index+1));
let completedTasks = this.state.completedTasks;
completedTasks = completedTasks.concat([this.state.tasks[index]]);
this.setState({
tasks,
completedTasks
});
},
addTask() {
let tasks = this.state.tasks.concat([this.state.task]);
this.setState({tasks})
},
render() {
return (
<View style={styles.container}>
<Text style={styles.header}>
Muli's To-Do
</Text>
<TextInput underlineColorAndroid={'transparent'}
style={styles.input}
onChangeText={(text) => {
this.setState({task: text});
} }
onEndEditing={()=> this.addTask()}
/>
<ScrollView>
{this.renderList(this.state.tasks)}
{this.renderCompleted(this.state.completedTasks)}
</ScrollView>
</View>
)
}
})
const styles = StyleSheet.create({
container: {
flex:1,
backgroundColor: '#3b5998'
},
header: {
color:'white',
margin: 0,
marginTop:10,
textAlign: 'center',
fontSize: 18
},
task: {
elevation:5,
backgroundColor:'white',
flexDirection: 'row',
height: 60,
borderWidth:1,
borderColor: 'black',
justifyContent:'space-between',
alignItems:'center',
padding: 20,
margin: 2,
borderRadius: 5,
},
input: {
elevation:10,
backgroundColor:'white',
height: 60,
borderWidth:1,
borderBottomWidth: 1,
borderRadius: 5,
borderColor:'black',
textAlign: 'center',
margin:10,
marginBottom:30,
fontSize:15,
color: '#3b5998',
},
completed: {
color: '#555',
textDecorationLine: 'line-through'
}
})
module.exports = Main;
请告诉我有关我可以提供的其他相关信息。
谢谢!
答案 0 :(得分:0)
似乎在componentWillMount
期间,您为tasks
和completedTasks
设置了未定义的状态。在全新设置中,您的存储将为空,并且未定义任务和completedTasks的响应。
您可以通过快速检查是否存在响应来调整componentWillMount,如下所示:
componentWillMount() {
AsyncStorage.getItem('tasks')
.then((response) => {
if (response) {
this.setState({tasks: JSON.parse(response)})
}
});
AsyncStorage.getItem('completedTasks')
.then((response) => {
if (response) {
this.setState({completedTasks: JSON.parse(response)})
}
});
},