我用React Natives KeyboardAvoidingView设置键盘显示时View的高度.但当我在应用程序中关闭键盘时,视图的高度不会更改回其原始值.

<KeyboardAvoidingView behavior="height" style={styles.step}>
  <View style={styles.stepHeader}>
    // my content
  </View>
</KeyboardAvoidingView>

在我打开和关闭键盘之前,红色轮廓的视图确实占据了整个空间.

Screenshot

推荐答案

Nisarg答案的更详细解释.

在构造函数中为KeyboardAvoidingView创建一个键

constructor(props) {
    this.state = {
      keyboardAvoidingViewKey: 'keyboardAvoidingViewKey',
    }
}

在键盘的will/did hide上添加侦听器(并在willUnmount中删除它)

import { KeyboardAvoidingView, Keyboard, Platform } from 'react-native'

componentDidMount() {
    // using keyboardWillHide is better but it does not work for android
    this.keyboardHideListener = Keyboard.addListener(Platform.OS === 'android' ? 'keyboardDidHide': 'keyboardWillHide', this.keyboardHideListener.bind(this));
}

componentWillUnmount() {
    this.keyboardHideListener.remove()
}

更新keyboardHideListener函数中的keyboardAvoidingViewKey,每次都应该是一个新值(我使用了一个时间戳),并在呈现KeyboardAvoidingView元素时使用这个键.

keyboardHideListener() {
    this.setState({
        keyboardAvoidingViewKey:'keyboardAvoidingViewKey' + new Date().getTime()
    });
}

render() {
    let { keyboardAvoidingViewKey } = this.state
    return (
        <KeyboardAvoidingView behavior={'height'} key={keyboardAvoidingViewKey} style={...}>
            ...
        </KeyboardAvoidingView>
    )
}

Note:

使现代化

经过更深入的调查,我现在知道了为什么在更改密钥后会重新创建视图.

如果愿意,可以通过向App.js文件中添加以下代码来监视这些已发送的消息:

import MessageQueue from 'react-native/Libraries/BatchedBridge/MessageQueue'
const spyFunction = (msg) => {
    console.log(msg);
};

MessageQueue.spy(spyFunction);

如果这样做,您会在日志(log)中注意到,每次键更改时,作为返回发送的命令都是createViews,如上所述,它会创建嵌套在所述组件下的所有元素.

React-native相关问答推荐

错误:HostBody::get for prop NativeUnimoduleProxy中出现异常- Android虚拟设备(AVD)使用Expo测试React Native App时崩溃

AWS Amplify处理后端错误

react 本机中的TextInput对齐中的长文本

单击时更改ToucheableOpacity colored颜色 不起作用

如何在react native 中从 axios 重定向并将数据传递给路由

React Native TextInput 在android上打开时会自动关闭

不能总是在 Chrome 中设置 React Native 断点

应用程序主体尚未注册

React Native React 导航标题按钮事件

React-native -run-ios 错误无法构建 iOS 元素.我们运行了xcodebuild命令,但它以错误代码 65 退出

React.js - 为所有组件方法使用属性初始化器

使用直接在 Windows 中运行的模拟器在 WSL 中运行 React Native

React-Native 构建失败的应用程序:mergeDebugAssets

是否可以使用react-native 创建 Android Wear 应用程序

xcode 8.3 框架未找到架构 armv7 的 FileProvider

react-native createbottomtabnavigator 隐藏标签栏标签

React Native - React Navigation导航转换

react-native:如何覆盖组件中定义的默认样式

如何升级 react-native gradle 版本

如何允许 react-native 启用对 JSX(扩展)文件的支持