【问题标题】:Bug in react native textInput when using state on android在android上使用状态时反应本机textInput的错误
【发布时间】:2019-04-18 11:44:18
【问题描述】:

此错误仅存在于 Android 上。

如果我在 Android 上有一个 textInput 并将值设置为状态。然后在其他地方更改值,当我在 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',
  },
});

【问题讨论】:

    标签: android react-native textinput


    【解决方案1】:

    请改用onChangeText

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

    【讨论】:

    • 很遗憾这没有帮助
    【解决方案2】:

    好的,我发现这是三星独有的问题,与键盘缓存有关。解决办法是在改变值的状态后给keyboard.dismiss。

    【讨论】:

    • 亚当,我不明白如何在更改状态后关闭键盘。你能帮助我吗? =)
    • 只需运行函数 Keyboard.dismiss()
    【解决方案3】:

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

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

    所以现在我正在制定一种解决方法,让 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}
        />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多