React native - flex属性未居中表单

wi3ka0sx  于 2023-08-07  发布在  React
关注(0)|答案(2)|浏览(124)

我有一个窗体 Package 在父容器(它是一个KeyboardAvoidingView)中,在添加适当的flex属性以水平和垂直居中窗体之后,窗体在两个方向上都不居中。
下面是包含表单的父容器的代码:

const AuthScreen = () => {
    const [isSignup, setIsSignup] = useState(false)

    return (
        <SafeAreaView style={{flex: 1}}>
            <PageContainer>
                <ScrollView>
                    <KeyboardAvoidingView style={styles.keyboardAvoidingView} behavior={Platform.OS === "ios" ? "height" : undefined} keyboardVerticalOffset={100}>
                        <LoginForm />
                    </KeyboardAvoidingView>
                </ScrollView>
            </PageContainer>
        </SafeAreaView>
    )
}

const styles = StyleSheet.create({
    keyboardAvoidingView: {
        padding: 10,
        alignItems: 'center',
        justifyContent: 'center',
        flex: 1,
    }
})

export default AuthScreen

字符串
下面是表单(LoginForm)代码。这是我希望居中的表单:

const LoginForm = () => {
  const [formState, dispatchFormState] = useReducer(reducer, initialState);

  const inputChangedHandler = useCallback((id, value) => {
    // Validate current input status
    const validationResult = validateInput(id, value)
    dispatchFormState({id, value, validationResult})
  }, [dispatchFormState])

  return (
    <>
       <Input errorText={formState.inputValidities["email"]} inputChanged={inputChangedHandler} id="email" placeholder="Email Address" /> 
       <Input errorText={formState.inputValidities["password"]}  inputChanged={inputChangedHandler} id="password" placeholder="Password" /> 
       <SubmitButton title='Login' />
    </>
  )
}

const styles = StyleSheet.create({
 
})

export default LoginForm

Input组件代码:

const Input = props => {

    const {id, placeholder, inputChanged, errorText} = props

    return <View style={styles.container}>
        <View style={styles.inputContainer}>
            <TextInput onChangeText={(text) => inputChanged(id, text)} placeholderTextColor="white" style={styles.input} placeholder={placeholder} />
        </View>

        {
            errorText &&
            <View style={styles.errorContainer}>
                <Text style={{color: 'red'}}>{errorText[0]}</Text>
            </View>
        
        }
    </View>
}

const styles = StyleSheet.create({
    container: {
        width: '100%',
        marginTop: 32,
        alignItems: 'center',
    },
    input: {
        backgroundColor: colors.inputBgColor,
        flex: 1,
        paddingVertical: 6,
        paddingHorizontal: 12,
        letterSpacing: 0.3,
        color: 'white'
    },  
    inputContainer: {
        width: '100%',
        flexDirection: 'row',
        alignItems: 'center',
    },
    errorContainer: {
        alignItems: 'center',
        marginTop: 10
    }
})

export default Input


我能知道为什么这个表格没有居中吗?- 谢谢你-谢谢

6ie5vjzr

6ie5vjzr1#

使用contentContainerStyle将样式应用于滚动视图内容容器。使用flexGrow: 1可以让孩子在需要的时候成长。

<ScrollView contentContainerStyle={{flexGrow: 1}}>
...
</ScrollView>

字符串

kulphzqa

kulphzqa2#

代码的问题可能与在父容器上组合使用KeyboardAvoidingViewflex属性有关。使用KeyboardAvoidingView并尝试使用flex将其内容居中时,可能会遇到意外行为。
以下是解决此问题的建议:
1.从AuthScreen中的keyboardAvoidingView样式中删除flex: 1。这将防止KeyboardAvoidingView占用所有可用空间。
1.不要在keyboardAvoidingView上使用alignItems: 'center'justifyContent: 'center',而是将这些属性应用于ScrollViewPageContainer组件。这将使KeyboardAvoidingView位于ScrollView的中心,PageContainer位于SafeAreaView的中心。
以下是AuthScreen的更新代码:

const AuthScreen = () => {
    const [isSignup, setIsSignup] = useState(false);

    return (
        <SafeAreaView style={{ flex: 1 }}>
            <PageContainer style={styles.pageContainer}>
                <ScrollView contentContainerStyle={styles.scrollViewContent}>
                    <KeyboardAvoidingView
                        style={styles.keyboardAvoidingView}
                        behavior={Platform.OS === "ios" ? "height" : undefined}
                        keyboardVerticalOffset={100}
                    >
                        <LoginForm />
                    </KeyboardAvoidingView>
                </ScrollView>
            </PageContainer>
        </SafeAreaView>
    );
};

const styles = StyleSheet.create({
    pageContainer: {
        flex: 1,
        alignItems: 'center',
        justifyContent: 'center',
    },
    scrollViewContent: {
        flexGrow: 1,
        alignItems: 'center',
        justifyContent: 'center',
    },
    keyboardAvoidingView: {
        padding: 10,
    },
});

export default AuthScreen;

字符串
请注意,我添加了两个新样式:pageContainerscrollViewContent,分别处理SafeAreaViewScrollView内内容的居中。
通过此更改,您的LoginForm组件现在应该在水平和垂直方向上居中。

相关问题