在android上使用状态时,react native textInput中存在错误

在android上使用状态时,react native textInput中存在错误,android,react-native,textinput,Android,React Native,Textinput,这个bug只存在于Android上 如果我在Android上有一个textInput,并将值设置为state。然后在其他地方更改值,当我在textInput上使用onChange时,它使用旧的文本值,而不是新的状态 这是我的点心 下面是显示它不工作的整个代码 import * as React from 'react'; import { Text, View, StyleSheet, TextInput, TouchableOpacity } from 'react-native';

这个bug只存在于Android上

如果我在Android上有一个textInput,并将值设置为state。然后在其他地方更改值,当我在textInput上使用onChange时,它使用旧的文本值,而不是新的状态

这是我的点心

下面是显示它不工作的整个代码

    import * as React from 'react';
import { Text, View, StyleSheet, TextInput, TouchableOpacity } from 'react-native';
import { Constants } from 'expo';

// You can import from local files
import AssetExample from './components/AssetExample';

// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';

export default class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      text:  'aaa'
    }
  }
  render() {
    return (
      <View style={styles.container}>
        <TextInput
          value={this.state.text}
          onChange={(event) => this.setState({
      text: event.text,
    })}
        />
      <TouchableOpacity
        onPress={()=>this.setState({
      text: "",
    })}
        style={styles.submit}
      >
      </TouchableOpacity>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
  submit: {
    height: 200,
    width: 200,
    backgroundColor: 'blue',
    textAlign: 'center',
  },
});
import*as React from'React';
从“react native”导入{Text,View,StyleSheet,TextInput,TouchableOpacity};
从“expo”导入{Constants};
//可以从本地文件导入
从“./components/AssetExample”导入AssetExample;
//或npm中可用的任何纯javascript模块
从“react native paper”导入{Card};
导出默认类App扩展React.Component{
建造师(道具){
超级(道具)
此.state={
文本:“aaa”
}
}
render(){
返回(
这是我的国家({
text:event.text,
})}
/>
这是我的国家({
正文:“,
})}
style={style.submit}
>
);
}
}
const styles=StyleSheet.create({
容器:{
弹性:1,
为内容辩护:“中心”,
paddingTop:Constants.statusBarHeight,
背景颜色:“#ecf0f1”,
填充:8,
},
提交:{
身高:200,
宽度:200,
背景颜色:“蓝色”,
textAlign:'中心',
},
});

改用
onChangeText

onChangeText={(text)=>{this.setState({text});}}

好吧,我发现这是三星唯一的问题,和键盘缓存有关。解决方案是在更改值的状态后关闭键盘

我也在Moto手机上看到了这一点。我通过从onKeyPress而不是onChangeText更新状态来处理它。恼人的是,你必须处理退格,也因为现在它会闪烁——输入短暂地显示新的按键值,然后隐藏它,然后显示我的按键处理程序设置的新状态。()也许我忽略了一个更简单的解决方案,但下面是我的示例:

validateEmail({ nativeEvent: { key } }) {
    if (key == "Enter") return;

    let value = (this.state.email || "");
    if (key == "Backspace") {
      value = value.substring(0, Math.max(0, value.length - 1));
    }
    else {
      value = value.concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());
    }
    this.setState({ email: value});
  }

...

 const Email = <Input
      value={this.state.email}
      onKeyPress={this.validateEmail}
    />
validateEmail({nativeEvent:{key}}){
如果(键==“回车”)返回;
让value=(this.state.email | |“”);
如果(键==“退格”){
value=value.substring(0,Math.max(0,value.length-1));
}
否则{
value=value.concat(key.replace(/[^a-z0-9.+@@-]+/ig,”).toLowerCase());
}
this.setState({email:value});
}
...
常量电子邮件=
因此,现在我正在做一个变通办法,让onchangetext处理有效的按键,并仅在必要时将其从onkeypress更改为最小化闪烁:

 isValidEmail(str) {
    return !/[^a-z0-9.+@_-]+/g.test(str);
  }

  validateEmail({ nativeEvent: { key } }) {
    console.log("key: " + key);

    // don't update state here if key is valid:
    if (key == "Enter" || key == "Backspace" || this.isValidEmail(key)) return;

    // update state with corrected key:  
    value = (this.state.email || "").concat(key.replace(/[^a-z0-9.+@_-]+/ig, "").toLowerCase());

    console.log("value: " + value);
    this.setState({ email: value});
  }

...

  const Email = <Input
      value={this.state.email}
      onChangeText={(text) => { if (this.isValidEmail(text)) this.setState({email: text})}}
      onKeyPress={this.validateEmail}
    />
isValidEmail(str){
返回!/[^a-z0-9.+@-]+/g.test(str);
}
validateEmail({nativeEvent:{key}}){
控制台日志(“键:+键);
//如果密钥有效,则不更新此处的状态:
如果(key==“Enter”| | key==“Backspace”| | this.isValidEmail(key))返回;
//使用更正的密钥更新状态:
value=(this.state.email | | |“”).concat(key.replace(/[^a-z0-9.+@-]+/ig,”).toLowerCase());
console.log(“值:”+value);
this.setState({email:value});
}
...
const Email={if(this.isValidEmail(text))this.setState({Email:text}}}
onKeyPress={this.validateEmail}
/>

不幸的是,这对Dam毫无帮助,我不明白在更改状态后如何关闭键盘。你能帮我吗只需运行funciton键盘