Текст исчез после выбора следующего ввода — React Native Android

#android #react-native

#Android #react-native

Вопрос:

Я создаю страницу входа в React Native для телефонов Android. И теперь у меня небольшая проблема с отображением текста. Когда пользователь открывает экран входа в систему и вводит свой адрес электронной почты или имя пользователя, а затем нажимает на поле пароля, все из предыдущего поля будут «удалены» или «скрыты». Это код для входа на экран:

 import React from 'react'
import { 
View, 
TextInput, 
StyleSheet, 
TouchableOpacity, 
Dimensions,
// AsyncStorage 
} from 'react-native';
import AsyncStorage from '@react-native-community/async-storage';
import { SafeAreaConsumer } from 'react-native-safe-area-context';

import axios from 'axios';

import {getAppLangCode} from '../helpers/store';

import {mediumFontFamily} from '../constants/Colors';
import {translate} from "../helpers/i18n";
import {getUserDatas} from '../helpers/user';


import BackButton from '../components/inners/BackButton';
import TextRegular from '../components/ui/TextRegular';
import TextMedium from '../components/ui/TextMedium';
import TextHeavy from '../components/ui/TextHeavy';

import Loader from '../components/Loader';
import ErrorSuccessPopup from '../components/ErrorSuccessPopup';

// const wHeight = Dimensions.get('window').height;

export default class SignInScreen extends React.Component {
static navigationOptions = {
    headerShown: false,
    headerTransparent: true,
    title: 'Please sign in',
};

constructor(props){
    super(props);
    this.state = {
        log: '',
        password: '',
        validating: false,
        focus: '',

        isSuccess: false, 
        title: translate('login_wrong'),
        message: '',
        isError: false,
    }
    this._ismounted = true;
}
componentWillUnmount() {
    this._ismounted = false;
}
// static navigationOptions = ({ navigation }) => {
//     return {

//         title: translate('chat_screen'),
//         headerLeft: () => {
//             return <BackButton isBlack={true} onPress={navigation.goBack} style={{marginLeft: 10}}/>
//         },
//     };
// };
toForgetPwd = ()=>{
    this.props.navigation.navigate('ForgetPwd');
}
toRegister = () => {
   this.props.navigation.navigate('Register');
}
onInputChange = (name)=>(text)=>{
    this.setState({[name]:text})
}
onFucusInput = (name) =>{
    this.setState({focus: name})
}
_signInAsync = async () => {
    const _self = this
    const {log,password} = _self.state
    if(log.length < 3 || password.length < 3){
        _self.setState({ isError: true, message:translate('login_enter_email'), title:translate('login_wrong') })
        return;
    }

    _self.setState({ validating: true });

    const lang = await getAppLangCode();

    axios({
        method: 'POST',
        url: `/login`, 
        data: {
            log,
            password,
            lang: lang,
        },
    }).then(res => {
        //Set the results to the people array.
        // console.log(res.data);
        const {success} = res.data
        const title = null != res.data.title ? res.data.title : '';
        const message = null != res.data.message ? res.data.message : '';
        if( success ){
            _self.saveToStorage(res.data.data).then(rt=>{
                if( _self._ismounted ){
                    if( rt == true ){
                        _self.setState({ isSuccess: true, validating: false, message, title })
                    }else{
                        _self.setState({ isSuccess: true, validating: false, message:'Failed to store auth', title:translate('login_wrong') })
                    }
                }
            });
        }else{
            _self.setState({ isError: true, validating: false, message, title })
        }
        //Error handle the promise and set your errorMessage
    }).catch(err => {
        _self.setState({ validating: false, isError: true });
        console.log(err)
    } );

}

saveToStorage = async (userData) => {
    
    let rt = false;
    //if (userData) {
        try {
            await AsyncStorage.setItem('user', JSON.stringify({
                isLoggedIn: true,
                authToken: userData.auth_token,
                id: userData.user_id,
                name: userData.user_login
            }));
            // await getUserDatas() // .then(rt=>console.log(rt))
            getUserDatas() // .then(rt=>console.log(rt))
            
            rt = true
        } catch (error) {
            // Error saving data
            rt = false;
            // if( null != error.message )
        }
        // return true;
    //}
    
    return rt;
}

nextField = ()=>{
    this.password.focus()
}
errorButton(){
    const {apColors} = this.props;
    return (
        <TouchableOpacity onPress={()=>{this.setState({ isError: false });}}>
            <View style={[styles.popupButton,{backgroundColor: apColors.appColor,}]}>
                <TextHeavy style={styles.loginButtonText}>{translate('login_try_again')}</TextHeavy>
            </View>
        </TouchableOpacity>
    )
}
successButton(){
    const {apColors} = this.props;
    return (
        <TouchableOpacity onPress={() => this._onPressDone() }>
            <View style={[styles.popupButton,{backgroundColor: apColors.appColor,}]}>
                <TextHeavy style={styles.loginButtonText}>{translate('login_done')}</TextHeavy>
            </View>
        </TouchableOpacity>
    )
}
_onPressDone(){
    this.setState({ isSuccess: false });
    const {route,navigation} = this.props;
    const loggedInRoute = route.params?.loggedInRoute ?? 'Home';
    const backRoute = route.params?.backRoute ?? 'Home';
    switch (loggedInRoute){
        case 'Profile':
            navigation.navigate( 'ProfileStack', { screen: 'Profile', params: {backRoute} } )
            break;
        case 'Bookings':
            navigation.navigate( 'BookingsStack', { screen: 'Bookings', params: {backRoute} } )
            break;
        case 'Bookmarks':
            navigation.navigate( 'BookmarksStack', { screen: 'Bookmarks', params: {backRoute} } )
            break;
        default: 
            navigation.navigate( loggedInRoute, {backRoute} )
    }
    
}
_renderGreeting(){
    const {apColors} = this.props;
    return (
        <>
            <TextHeavy style={[styles.loginGreeting,{color: apColors.hText,}]}>{translate('login_hi')}</TextHeavy>
            <TextHeavy style={[styles.loginGreeting,{color: apColors.hText,}]}>{translate('login_welcome')}</TextHeavy>
        </>
    )
}
_onGoBack(){
    
    // const backRoute = this.props.navigation.getParam('backRoute', 'Home');
    const backRoute = this.props.route.params?.backRoute ?? 'Home';
    this.props.navigation.navigate(backRoute)
}
_renderHeader(cstyle = {}){
    // {top: 30   insets.top}
    const {apColors} = this.props;
    return (
        <View style={[styles.navBar,cstyle]}>
            <BackButton color={apColors.backBtn} onPress={ () => this._onGoBack() }/>
        </View>
    )
}
_renderFooter(){
    const {apColors} = this.props;
    return (
        <View style={styles.signUp}>
            <TextRegular style={[styles.signUpText,{color: apColors.pText,}]}>{translate('dont_have_account')}</TextRegular>
            <TouchableOpacity onPress={this.toRegister}>
                <TextMedium style={[styles.signUpButton,{color: apColors.pText,}]}>{translate('sign_up')}</TextMedium>
            </TouchableOpacity>

        </View>
    )
}

render() {
    const {apColors} = this.props;
    const {focus,validating,isSuccess,isError,title,message} = this.state
    let logStyle = [styles.textInput,{borderColor: apColors.separator,color: apColors.pText}],
        pwdStyle = [styles.textInput,{borderColor: apColors.separator,color: apColors.pText}];
    if( focus == 'log' ) logStyle = [logStyle,{borderColor: apColors.inputFocus,}]
    if( focus == 'password' ) pwdStyle = [pwdStyle,{borderColor: apColors.inputFocus,}]
    
    // return null;
    return (
        <SafeAreaConsumer style={{flex: 1}}>
            {insets => <View style={[styles.container,{backgroundColor: apColors.appBg,paddingTop: insets.top,paddingBottom: insets.bottom,paddingLeft: insets.left,paddingRight: insets.right}]}>
                {this._renderHeader()}

                <Loader loading={validating}/>
                
                <ErrorSuccessPopup isSuccess={isSuccess} isError={isError} title={title} message={message} successButton={this.successButton()} errorButton={this.errorButton()}/>

                <View style={styles.loginInner}>
                    {this._renderGreeting()}

                    <TextRegular style={[styles.fieldLabel,{color: apColors.fieldLbl,marginTop:40}]}>{translate('user_email')}</TextRegular>
                    <TextInput 
                        // placeholder="Username or Email"
                        style={logStyle}
                        onChangeText={this.onInputChange('log')}
                        onFocus={e=>this.onFucusInput('log')}
                        returnKeyType='next'
                        onSubmitEditing = {this.nextField}
                        autoCorrect={false}
                        underlineColorAndroid='transparent'
                        autoCapitalize="none"
                        autoCompleteType="off"
                        keyboardType="email-address"
                    />
                    <TextRegular style={[styles.fieldLabel,{color: apColors.fieldLbl,}]}>{translate('password')}</TextRegular>
                    <TextInput 
                        // placeholder="Password"
                        style={pwdStyle}
                        onChangeText={this.onInputChange('password')}
                        onFocus={e=>this.onFucusInput('password')}
                        secureTextEntry={true}
                        returnKeyType='done'
                        ref={input=>this.password = input}
                        autoCorrect={false}
                        autoCapitalize="none"
                        underlineColorAndroid='transparent'
                        // autoCompleteType="off"
                        // keyboardType="visible-password"

                    />

                    <TouchableOpacity onPress={this.toForgetPwd}>
                        <TextRegular style={[styles.forgetPassword,{color: apColors.appColor,}]}>{translate('forget_password')}</TextRegular>
                    </TouchableOpacity>
                    <View style={styles.spacer}/>
                    <TouchableOpacity onPress={this._signInAsync}>
                        <View style={[styles.loginButton,{backgroundColor: apColors.appColor,}]}>
                            <TextHeavy style={styles.loginButtonText}>{translate('login')}</TextHeavy>
                        </View>
                    </TouchableOpacity>

                    
                    

                </View>
                
                {this._renderFooter()}

            </View>}
        </SafeAreaConsumer>
    );
}
}

const styles = StyleSheet.create({
container: {
    
    flex:1,
    // alignItems:'center',
    // justifyContent:'center'

    minHeight: Dimensions.get('window').height - 200,
},
navBar: {
    // position: 'absolute',
    // top: 52,
    // // marginTop: 52,
    // left: 0,
    // right: 0,
    // zIndex: 200,
    paddingLeft: 15,
    paddingRight: 15,
    flexDirection: 'row',
    alignItems: 'center',
    // backgroundColor: 'red',
    paddingTop: 8,
    paddingBottom: 7,
    
},
loginInner: {
    flex: 1,
    paddingTop: 50,
    paddingHorizontal: 30,

    // backgroundColor: 'red',
},
loginGreeting: {
    
    fontSize: 34,
},
fieldLabel:{
    fontSize: 17,
    
    marginTop: 20,
},

textInput:{
    // margin:0,
    // marginTop:20,
    // height:40,
    // backgroundColor:'red',
    // // borderRadius:20,
    // paddingLeft:15,
    // // fontSize: AppFontSize,
    // // fontFamily: AppFontFamily,
    // borderRadius: 4,
    // width: 150,
    // flex: 1,
    height: 35,
    // marginTop: 5,
    paddingVertical: 5,

    borderBottomWidth: 1,
    borderStyle: 'solid',
    fontSize: 17,
    fontFamily: mediumFontFamily,
},
forgetPassword: {
    marginTop: 35,
    fontSize: 17,
    
    textAlign: 'right',
},
spacer: {
    height: 60,
},
loginButton: {
    
    height: 44,
    borderRadius: 8,
    justifyContent: 'center',
    // marginTop: 60,
},
loginButtonText: {
    color: '#fff',
    fontSize: 15,
    textAlign: 'center',

},
signUp: {
    flexDirection: 'row',
    alignItems: 'center',
    justifyContent: 'center',
    // alignSelf: 'flex-end'
    // position: 'absolute',
    // bottom: 30,
    // left: 0,
    // right: 0,
    marginBottom: 15,
},
signUpText: {
    
    fontSize: 15,
    lineHeight: 20,
},
signUpButton: {
    
    fontSize: 15,
    lineHeight: 17,
    marginLeft: 5,
},
popupButton: {
    
    height: 35,
    borderRadius: 8,
    justifyContent: 'center',
    paddingHorizontal: 30,
    marginTop: 20
},
})
  

Где у меня ошибка? Как решить эту проблему? Спасибо всем за помощь.

Комментарии:

1. Можете ли вы поделиться всем скриптом? Нравится, что делают эти два метода onChangeText={this.onInputChange('log')} onFocus={e=>this.onFucusInput('log')}

2. Я обновляю вопрос, теперь вы можете посмотреть полный код на странице Sign In @praveen-me

3. Если вы попытаетесь ввести в текстовое поле Имя пользователя или адрес электронной почты и попытаетесь ввести свой пароль, имя пользователя или адрес электронной почты исчезнут… Я не знаю, где ошибка… @praveen-me