在Android上使用状态时在响应本机textInput中的错误

时间:2019-04-18 11:44:19

标签: android react-native textinput

此错误仅在Android上存在。

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

这是我的零食 https://snack.expo.io/SyV1mkIc4

下面是显示其无效的整个代码

    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',
  },
});

3 个答案:

答案 0 :(得分:1)

改为使用onChangeText

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

答案 1 :(得分:0)

好吧,我发现这是一个三星唯一的问题,与键盘缓存有关。解决方法是更改​​值的状态后使用keyboard.dismiss。

答案 2 :(得分:0)

我也在Moto手机上看到了这一点。我通过更新onKeyPress而不是onChangeText的状态来处理它。烦人的原因是您必须处理退格键,并且还因为它现在闪烁了-输入会短暂显示新的按键值,然后将其隐藏,然后显示由我的按键处理程序设置的新状态。 (As seen in this question)也许我忽略了一个更简单的解决方案,但这是我的示例:

 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}
    />

因此,现在我正在采取一种变通方法,以让onchangetext处理有效的按键,并仅在必要时才将其从onkeypress更改为最小化闪烁:

const { body } = req;
const eventName = req.query.eventName || body.eventName || (body.data && body.data.eventName);
const description = req.query.description || body.description || (body.data && body.data.description);
const startTime = req.query.startTime || body.startTime || (body.data && body.data.startTime);
const endTime = req.query.endTime || body.endTime || (body.data && body.data.endTime);

const eventData = {
    eventName: eventName,
    description: description,
    startTime: startTime,
    endTime: endTime
    };