问题描述
我为 Android 应用程序编写了一个带有多个输入的 flatList,一个输入(别名)应该在列表中可见,其余是 onClick 事件的参数。无论如何,这工作正常,直到我关闭并重新打开应用程序。
然后所有值都被 convertToStringWithSeparators
中的最后一个值覆盖。 (在本例中为 task.pass
)
有人知道我做错了什么吗?
export default class myApp extends Component {
state = {
tasks: [ ],text: "",alias:"",user:"",pass:"",show: true,}
toggle = () => this.setState(currentState => ({
show: !currentState.show
}));
changeTextHandler = text => {
this.setState({ text: text });
};
changeAliasHandler = alias => {
this.setState({ alias: alias });
};
changeUserHandler = user => {
this.setState({ user: user });
};
changePassHandler = pass => {
this.setState({ pass: pass });
};
addTask = () => {
let notEmpty = this.state.text.trim().length > 0;
if (notEmpty) {
this.setState(
prevstate => {
let { tasks,text,alias,user,pass } = prevstate;
return {
tasks: tasks.concat({ key: tasks.length,alias: alias,text: text,user: user,pass: pass }),alias: "",user: "",pass: ""
};
},() => Tasks.save(this.state.tasks)
);
}
};
deleteTask = i => {
this.setState(
prevstate => {
let tasks = prevstate.tasks.slice();
tasks.splice(i,1);
return { tasks: tasks };
},() => Tasks.save(this.state.tasks)
);
};
componentDidMount() {
Keyboard.addListener(
isAndroid ? "keyboardDidShow" : "keyboardWillShow",e => this.setState({ viewMargin: e.endCoordinates.height + viewPadding })
);
Keyboard.addListener(
isAndroid ? "keyboardDidHide" : "keyboardWillHide",() => this.setState({ viewMargin: viewPadding })
);
Tasks.all(tasks => this.setState({ tasks: tasks || [] }));
}
componentwillUnmount() {
// fix Warning: Can't perform a React state update on an unmounted component
this.setState = (state,callback)=>{
return;
};
}
render() {
return (
<View
style={[styles.container,{ paddingBottom: this.state.viewMargin }]}
>
<Text style={styles.appTitle}>My Nodes:</Text>
<FlatList
style={styles.list}
data={this.state.tasks}
keyExtractor={(item,index) => item.toString()}
renderItem={ ( {item,index} ) => (
<View>
<View style={styles.listItemCont}>
<Text style={styles.listItem} onPress={() => {Webbrowser.openbrowserAsync(`https://${item.user}:${item.pass}@${item.text}`)}}>
{item.alias},https://{item.user}:{item.pass}@{item.text}
</Text>
<Button color= "#ffff" title="✖" onPress={() => this.deleteTask(index)} />
</View>
<View style={styles.hr} />
</View>
)}
/>
<Button onClick={this.toggle} title=" ^ "/>
{this.state.show &&
<View style={styles.inputBox}>
<Text style={{color:"white",marginLeft: 5}}>Add Node:</Text>
<TextInput
style={styles.textInput}
onChangeText={this.changeAliasHandler}
onSubmitEditing={this.addTask}
value={this.state.alias}
placeholder="Alias"
returnKeyType="done"
returnKeyLabel="done"
/>
<TextInput
style={styles.textInput}
onChangeText={this.changeTextHandler}
onSubmitEditing={this.addTask}
value={this.state.text}
placeholder="Domain"
returnKeyType="done"
returnKeyLabel="done"
/>
<TextInput
style={styles.textInput}
onChangeText={this.changeUserHandler}
onSubmitEditing={this.addTask}
value={this.state.user}
placeholder="Dashboard-user"
returnKeyType="done"
returnKeyLabel="done"
/>
<TextInput
style={styles.textInput}
onChangeText={this.changePassHandler}
onSubmitEditing={this.addTask}
value={this.state.pass}
placeholder="Dashboard-password"
returnKeyType="done"
returnKeyLabel="done"
/>
</View>
}
</View>
)
}
}
这是相关部分:
let Tasks = {
convertToArrayOfObject(tasks,callback) {
return callback(
tasks ? tasks.split("||").map((task,i) => ({ key: i,text: task,user: task,pass: task,alias: task,url: task })) : []
);
},convertToStringWithSeparators(tasks) {
return tasks.map(task => (task.alias,task.text,task.user,task.pass)).join("||")
},all(callback) {
return AsyncStorage.getItem("TASKS",(err,tasks) =>
this.convertToArrayOfObject(tasks,callback)
);
},save(tasks) {
AsyncStorage.setItem("TASKS",this.convertToStringWithSeparators(tasks));
}
};
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)