<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ react native - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ react native - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 19:37:31 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/react-native/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo configurar el inicio de sesión de Google en React Native y Firebase ]]>
                </title>
                <description>
                    <![CDATA[ El inicio de sesión de Google es una excelente función de inicio de sesión para ofrecer a los usuarios de su aplicación. Les facilita crear una cuenta e iniciar sesión. Y lo que es aún mejor, Firebase hace que sea extremadamente fácil para los desarrolladores agregar soporte para el inicio ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-configurar-el-inicio-de-sesion-de-google-en-react-native-y-firebase/</link>
                <guid isPermaLink="false">648c75c49764040891b7e67b</guid>
                
                    <category>
                        <![CDATA[ react native ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Sierra ]]>
                </dc:creator>
                <pubDate>Mon, 26 Jun 2023 18:29:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/React-native-Google-login.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/google-login-with-react-native-and-firebase/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Set Up Google Login in React Native &amp; Firebase</a>
      </p><p>El inicio de sesión de Google es una excelente función de inicio de sesión para ofrecer a los usuarios de su aplicación. Les facilita crear una cuenta e iniciar sesión.</p><p>Y lo que es aún mejor, Firebase hace que sea extremadamente fácil para los desarrolladores agregar soporte para el inicio de sesión de Google. Pero configurar el entorno de React Native puede crear algunos desafíos, que se cubren completamente en este tutorial.</p><p>React Native y Firebase SDK hacen que la implementación del inicio de sesión de Google sea bastante sencilla. Construyamos una aplicación simple que solo tenga un botón de inicio de sesión de Google. Una vez que el usuario inicie sesión con éxito en Google, mostraremos la información del usuario recuperada de su cuenta de Google, así como un botón de cierre de sesión.</p><p>También puede agregar Facebook Login a su aplicación si está interesado en brindar aún más opciones de inicio de sesión a sus usuarios. Puede consultar esta guía para iniciar sesión con <a href="https://instamobile.io/react-native-tutorials/facebook-login-react-native-firebase/">Facebook en React Native con Firebase</a> si desea obtener más información sobre cómo configurar el inicio de sesión con Facebook.</p><h2 id="-por-qu-usar-un-bot-n-de-inicio-de-sesi-n-de-google-en-aplicaciones-m-viles">¿Por qué usar un botón de inicio de sesión de Google en aplicaciones móviles?</h2><ol><li>El uso de Google u otros terceros puede hacer que su proceso de autenticación sea sencillo y amigable. Los usuarios no tienen que perder tiempo en el proceso de registro, lo que mejorará enormemente sus tasas de registro y retención.</li><li>Es segura y protegida.</li><li>Los usuarios confían más en Google o Facebook que en un sitio o aplicación desconocidos en Internet.</li><li>Proporciona una buena experiencia de usuario. Como usuario, tenemos poca paciencia para cualquier acción o trabajo que necesitemos hacer, especialmente en una aplicación bastante desconocida que estamos probando por primera vez.</li></ol><p>Sin más preámbulos, pasemos directamente a la parte de desarrollo de aplicaciones de este tutorial.</p><h2 id="configuraci-n-del-proyecto-firebase">Configuración del proyecto Firebase</h2><p>Vaya a <a href="https://firebase.google.com/?hl=es-419">Firebase Console</a> y cree un proyecto de Firebase:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/create-new-firebase-project.png" class="kg-image" alt="create new firebase project" width="600" height="400" loading="lazy"><figcaption>create new firebase project</figcaption></figure><p>Aquí, necesitaremos configurar el nombre del proyecto Firebase y el identificador de la aplicación, así que primero creemos la aplicación React Native.</p><h2 id="creando-el-proyecto-react-native">Creando el proyecto React Native</h2><p>Primero, necesitamos crear un proyecto React Native usando el siguiente comando:</p><p><code>react-native init instamobile-google-login-demo</code></p><p>Aquí, hemos dado el nombre del proyecto como <strong>instamobile-google-login-demo</strong>. Ahora, necesitamos instalar el paquete <strong>react-native-google-signin</strong> usando el siguiente comando:</p><p><code>yarn add react-native-google-singin</code></p><p>El paquete <code>react-native-google-signin</code> se utiliza para implementar las funciones de autenticación de Google en la aplicación React Native. Ahora, necesitamos importar los módulos y componentes necesarios del paquete respectivo como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">import {
GoogleSignin,
GoogleSigninButton,
statusCodes,
} from 'react-native-google-signin';</code></pre><figcaption>import google sign-in component</figcaption></figure><p>A continuación, necesitamos crear los estados para manejar el estado de autenticación y la información del usuario. Para eso usamos el módulo <code>useState</code> como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">const [loggedIn, setloggedIn] = useState(false);
const [userInfo, setuserInfo] = useState([]);</code></pre><figcaption>add state</figcaption></figure><p>Ahora, necesitamos crear una función de inicio de sesión para manejar la autenticación como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">_signIn = async () =&gt; {
  try {
    await GoogleSignin.hasPlayServices();
    const {accessToken, idToken} = await GoogleSignin.signIn();
    setloggedIn(true);
  } catch (error) {
    if (error.code === statusCodes.SIGN_IN_CANCELLED) {
      // user cancelled the login flow
      alert('Cancel');
    } else if (error.code === statusCodes.IN_PROGRESS) {
      alert('Signin in progress');
      // operation (f.e. sign in) is in progress already
    } else if (error.code === statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
      alert('PLAY_SERVICES_NOT_AVAILABLE');
      // play services not available or outdated
    } else {
      // some other error happened
    }
  }
};</code></pre><figcaption>add google sign-in function</figcaption></figure><p>A continuación, debemos inicializar la configuración del objeto de inicio de sesión de Google aprovechando la función <code>useEffect</code> :</p><pre><code class="language-javascript">useEffect(() =&gt; {
   GoogleSignin.configure({
     scopes: ['email'], // what API you want to access on behalf of the user, default is email and profile
     webClientId:
       '418977770929-g9ou7r9eva1u78a3anassxxxxxxx.apps.googleusercontent.com', // client ID of type WEB for your server (needed to verify user ID and offline access)
     offlineAccess: true, // if you want to access Google API on behalf of the user FROM YOUR SERVER
   });
 }, []);</code></pre><p>Por último, necesitamos una función que maneje la acción de cierre de sesión. Para eso, vamos a implementar el método <code>signOut</code> como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">signOut = async () =&gt; {
    try {
      await GoogleSignin.revokeAccess();
      await GoogleSignin.signOut();
      setloggedIn(false);
      setuserInfo([]);
    } catch (error) {
      console.error(error);
    }
  };</code></pre><figcaption>add Google Sign-out function</figcaption></figure><p>Ahora, también necesitamos renderizar los componentes en la pantalla. Para eso, vamos a hacer uso de varios componentes como <code>View</code> y <code>Button</code>:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">return (
    &lt;&gt;
      &lt;StatusBar barStyle="dark-content" /&gt;
      &lt;SafeAreaView&gt;
        &lt;ScrollView
          contentInsetAdjustmentBehavior="automatic"
          style={styles.scrollView}&gt;
          &lt;Header /&gt;

          &lt;View style={styles.body}&gt;
            &lt;View style={styles.sectionContainer}&gt;
              &lt;GoogleSigninButton
                style={{width: 192, height: 48}}
                size={GoogleSigninButton.Size.Wide}
                color={GoogleSigninButton.Color.Dark}
                onPress={this._signIn}
              /&gt;
            &lt;/View&gt;
            &lt;View style={styles.buttonContainer}&gt;
              {!loggedIn &amp;&amp; &lt;Text&gt;You are currently logged out&lt;/Text&gt;}
              {loggedIn &amp;&amp; (
                &lt;Button
                  onPress={this.signOut}
                  title="LogOut"
                  color="red"&gt;&lt;/Button&gt;
              )}
            &lt;/View&gt;
          &lt;/View&gt;
        &lt;/ScrollView&gt;
      &lt;/SafeAreaView&gt;
    &lt;/&gt;
  );</code></pre><figcaption>UI code</figcaption></figure><p>Ahora bien, si ejecutamos nuestro proyecto en el emulador obtendremos los siguientes resultados:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/google-login-first-screen.png" class="kg-image" alt="google login first screen" width="600" height="400" loading="lazy"><figcaption>Login with Google React Native</figcaption></figure><p>Bastante dulce, ¿verdad? Hemos completado la implementación (tanto de la interfaz de usuario como de la lógica empresarial) en el nivel de React Native en nuestro proyecto.</p><p>Como puede ver, tenemos un botón "Iniciar sesión con Google" que se convierte en un botón de cierre de sesión una vez que la operación de inicio de sesión se completa con éxito.</p><p>Ahora vamos a configurar el paquete de inicio de sesión de Google y la aplicación Firebase.</p><h2 id="configuraci-n-de-los-proyectos-nativos-de-ios-y-android">Configuración de los proyectos nativos de iOS y Android</h2><p>Hay algunos pasos de configuración que debemos seguir antes de que el proyecto funcione por completo. En su mayoría están relacionados con el lado nativo real de la aplicación.</p><h3 id="para-ios">Para iOS</h3><p>Aquí, en VSCode (o cualquier Terminal) simplemente ejecute <code>cd ios &amp;&amp; pod install</code>. Luego abra el archivo <em>.xcworkspace</em> en <em>Xcode</em> (desde la carpeta ios) y asegúrese de que los Pods estén incluidos:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/install-google-login-lib-in-xcode.png" class="kg-image" alt="install google login lib in xcode" width="600" height="400" loading="lazy"><figcaption>install google login lib in xcode</figcaption></figure><h3 id="para-android"><strong>Para Android</strong></h3><p>1. Primero, necesitamos vincular el módulo nativo.</p><ul><li>En RN &gt;= 0.60 no debería necesitar hacer nada gracias a la vinculación automática.</li><li>En RN &lt; 0.60 ejecute el enlace <code>react-native link <strong><strong>react-native-google-signin</strong></strong></code>.</li></ul><p>2. Actualice <strong>android/build.gradle</strong> con la siguiente configuración:</p><pre><code class="language-java">buildscript {
    ext {
        buildToolsVersion = "27.0.3"
        minSdkVersion = 16
        compileSdkVersion = 27
        targetSdkVersion = 26
        supportLibVersion = "27.1.1"
        googlePlayServicesAuthVersion = "16.0.1" // &lt;--- use this version or newer
    }
...
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2' // &lt;--- use this version or newer
        classpath 'com.google.gms:google-services:4.1.0' // &lt;--- use this version or newer
    }
...
allprojects {
    repositories {
        mavenLocal()
        google() // &lt;--- make sure this is included
        jcenter()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
    }
}</code></pre><p>3. Actualice<code>android/app/build.gradle</code> con la siguiente configuración:</p><pre><code class="language-java">...
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "com.android.support:appcompat-v7:23.0.1"
    implementation "com.facebook.react:react-native:+"
    implementation(project(":react-native-community_google-signin")) // &lt;--- add this dependency
}</code></pre><p>Verifique que vinculó el módulo nativo <code>react-native link</code> &nbsp;– pero solo si usaste <code>react-native link</code>!</p><p>En <code>android/settings.gradle</code> &nbsp;deberíamos tener las siguientes configuraciones:</p><figure class="kg-card kg-code-card"><pre><code class="language-java">...
include ':react-native-google-signin', ':app'
project(':react-native-google-signin').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/google-signin/android')</code></pre><figcaption>setup google login for android in setting.gradle</figcaption></figure><p>A continuación, en <code>MainApplication.java</code> ,deberíamos agregar el paquete de Google como en el siguiente fragmento de código:</p><figure class="kg-card kg-code-card"><pre><code class="language-java">import co.apptailor.googlesignin.RNGoogleSigninPackage;  // &lt;--- import

public class MainApplication extends Application implements ReactApplication {

  ......

  @Override
    protected List&lt;ReactPackage&gt; getPackages() {
      return Arrays.&lt;ReactPackage&gt;asList(
          new MainReactPackage(),
          new RNGoogleSigninPackage() // &lt;-- this needs to be in the list
      );
    }
  ......

}</code></pre><figcaption>setup google login for android in MainApplication.java</figcaption></figure><h2 id="configuraci-n-para-firebase"><strong>Configuración para Firebase</strong></h2><h3 id="para-ios-1"><strong>Para iOS</strong></h3><p>Ahora, debemos comenzar con la configuración de Firebase. En Firebase, necesitamos configurar una aplicación en la nube de Google. Pero cuando configuramos el método de autenticación en Firebase, esto también crea una aplicación en la nube de Google.</p><p>Primero, necesitamos crear la aplicación Firebase iOS para obtener <strong>GoogleServiceinfo.plist</strong> como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/add-new-firebase-app-name.png" class="kg-image" alt="add new firebase app name" width="600" height="400" loading="lazy"><figcaption>add new firebase app name</figcaption></figure><p>A continuación, copiamos el archivo <strong>GoogleService-info.plist</strong> al proyecto Xcode como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/add-google-service-plist-to-xcode.png" class="kg-image" alt="add google service plist to xcode" width="600" height="400" loading="lazy"><figcaption>add google service plist to xcode</figcaption></figure><p>Ahora, debemos agregar la ID de cliente invertida presente en el archivo <strong>GoogleService-info.plist</strong> a los tipos de URL, como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/get-reverse-client-id-from-xcode.png" class="kg-image" alt="get reverse client id from xcode" width="600" height="400" loading="lazy"><figcaption>get reverse client id from xcode</figcaption></figure><p>El siguiente paso es ir a<strong><strong> Info</strong></strong> → <strong><strong>URL Types</strong></strong> y luego completar los <strong><strong>URL Schemes</strong></strong> como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/add-url-scheme-to-xcode.png" class="kg-image" alt="add url scheme to xcode" width="600" height="400" loading="lazy"><figcaption>add url scheme to xcode</figcaption></figure><h3 id="para-android-1"><strong>Para Android</strong></h3><p>Primero, necesitamos crear una aplicación de Android en Firebase. Para eso, necesitamos un nombre de paquete y un certificado <strong>SHA-1</strong> de nuestra aplicación. Luego, podemos registrar la aplicación Firebase como se muestra a continuación:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/create-new-android-firebase-app-300x252.png" class="kg-image" alt="create new android firebase app" width="600" height="400" loading="lazy"><figcaption>create new android firebase app</figcaption></figure><p>Podemos obtener el nombre del paquete en <strong>MainApplication.java</strong> de nuestro proyecto como se destaca en el fragmento de código a continuación:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/find-out-bundle-name-in-android-app-1024x408.png" class="kg-image" alt="find out bundle name in android app" width="600" height="400" loading="lazy"><figcaption>find out bundle name in android app</figcaption></figure><p>A continuación, podemos obtener la clave <strong>SHA-1</strong> en el archivo Keystore. En el directorio <strong>android/app</strong>, podemos ejecutar el comando:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">cd android/app ; 
keytool -exportcert -keystore debug.keystore -list -v</code></pre><figcaption>generate sha-1</figcaption></figure><p>Luego, aparecerá la clave <strong>SHA-1</strong>, como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/generate-sha1-for-register-android-app-in-firebase.png" class="kg-image" alt="generate sha1 for register android app in firebase" width="600" height="400" loading="lazy"><figcaption>generate sha1 for register android app in firebase</figcaption></figure><p>Después de crear con éxito la aplicación de configuración de Firebase, debemos descargar el archivo <strong>google-services.json</strong> y copiarlo en el directorio, como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/add-google-service-json-to-android-app-folder-250x300.png" class="kg-image" alt="add google service json to android app folder" width="600" height="400" loading="lazy"><figcaption>add google service json to android app folder</figcaption></figure><p>Ahora, el paso final es configurar un componente de inicio de sesión de Google en Android.</p><h3 id="instalaci-n-del-paquete-react-native-firebase">Instalación del paquete React Native Firebase</h3><p>Para instalar el paquete <strong>react-native-firebase</strong> versión 6, debemos ejecutar el siguiente comando en el símbolo del sistema de nuestro proyecto:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell"># Using npm 
npm install --save @react-native-firebase/app 
# Using Yarn 
yarn add @react-native-firebase/app</code></pre><figcaption>install react native firebase core component</figcaption></figure><p>El módulo <code>@react-native-firebase/app</code> debe instalarse antes de usar cualquier otro servicio de Firebase.</p><h3 id="para-ios-2"><strong>Para iOS</strong></h3><p>Ya tenemos <strong>GoogleService-Info.plist</strong> agregado a Xcode. Lo que queda es permitir que Firebase en iOS use las credenciales. El SDK de Firebase iOS debe configurarse durante la fase de arranque de su aplicación.</p><p>Para hacer esto, debemos abrir nuestro archivo <code>/ios/{projectName}/AppDelegate.m</code> , y agregar lo siguiente:</p><p>En la parte superior del archivo, necesitamos importar el SDK de Firebase:</p><figure class="kg-card kg-code-card"><pre><code class="language-swift">#import &lt;Firebase.h&gt;</code></pre><figcaption>include Firebase</figcaption></figure><p>Dentro de su método <code>didFinishLaunchingWithOptions</code> existente, debemos agregar lo siguiente en la parte superior del método:</p><figure class="kg-card kg-code-card"><pre><code class="language-m">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Add me --- \/
  if ([FIRApp defaultApp] == nil) {
    [FIRApp configure];
  }
  // Add me --- /\
  // ...
}</code></pre><figcaption>Firebase React Native</figcaption></figure><p>Finalmente, debemos ejecutar el siguiente comando para finalizar la instalación del paquete CocoaPods:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">cd ios ; pod install</code></pre><figcaption>CocoaPods install</figcaption></figure><p>Eso es todo. Ahora hemos completado la instalación del paquete principal de Firebase en iOS</p><h3 id="para-android-2"><strong>Para Android</strong></h3><p>Necesitamos configurar Firebase con credenciales de Android. Para permitir que Firebase en Android use las credenciales, el complemento de servicios de Google debe estar habilitado en el proyecto. Esto requiere la modificación de dos archivos en el directorio de Android.</p><p>Primero, agregue el complemento de servicios de Google como una dependencia dentro de su archivo <strong><strong>android/build.gradle</strong></strong>:</p><figure class="kg-card kg-code-card"><pre><code class="language-java">buildscript {
  dependencies {
    // ... other dependencies
    classpath 'com.google.gms:google-services:4.2.0'
    // Add me --- /\
  }
}
Lastly, execute the plugin by adding the following to the very bottom of your /android/app/build.gradle file:

apply plugin: 'com.google.gms.google-services'</code></pre><figcaption>add google service</figcaption></figure><h2 id="m-dulo-de-autenticaci-n-react-native-firebase">Módulo de autenticación React Native Firebase</h2><p>Una vez completada la instalación, debemos configurar el paquete principal de Firebase. A continuación, necesitamos instalar el módulo secundario para la autenticación. Para eso, necesitamos abrir una terminal y ejecutar el siguiente comando:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">yarn add @react-native-firebase/auth</code></pre><figcaption>install react native firebase auth&nbsp;</figcaption></figure><h3 id="para-ios-3"><strong>Para iOS</strong></h3><p>Solo necesitamos instalar los pods nuevamente en el símbolo del sistema:</p><figure class="kg-card kg-code-card"><pre><code>cd ios/ &amp;&amp; pod install</code></pre><figcaption>install cacao pod</figcaption></figure><h3 id="para-android-3"><strong>Para Android</strong></h3><p>Puede seguir las instrucciones en la <a href="https://rnfirebase.io/auth/usage/installation/android">documentación oficial</a> que solo se requiere si está utilizando React Native &lt;= 0.59 o necesita integrar manualmente la biblioteca.</p><h3 id="activar-el-inicio-de-sesi-n-de-google-en-firebase">Activar el inicio de sesión de Google en Firebase</h3><p>Tenemos que ir a la consola de Firebase. Luego, en la sección Autenticación, debemos hacer clic en Google como se muestra en la siguiente captura de pantalla:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/authentication-method-in-firebase-1024x396.png" class="kg-image" alt="authentication method in firebase" width="600" height="400" loading="lazy"><figcaption>authentication method in firebase</figcaption></figure><p>A continuación, debemos habilitar la configuración con la siguiente configuración y guardar la configuración como se muestra en la captura de pantalla a continuación:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/select-support-email-in-firebase-app.png" class="kg-image" alt="activate project support email" width="600" height="400" loading="lazy"><figcaption>activate project support email</figcaption></figure><p>En <strong>App.js</strong>, necesitamos importar la autenticación del paquete Firebase como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code>import auth from '@react-native-firebase/auth';</code></pre><figcaption>import firebase auth package</figcaption></figure><p>A continuación, debemos integrar la configuración de autenticación a la función de <strong><strong>sign-in</strong></strong>. Después de un inicio de sesión exitoso, almacenamos <strong><strong>accessToken</strong></strong> y <strong><strong>idToken</strong></strong> en <strong><strong>Firebase. </strong></strong>Ahora, podemos intentar iniciar sesión con Google en nuestra aplicación de demostración React Native.</p><figure class="kg-card kg-code-card"><pre><code class="language-javacript">_signIn = async () =&gt; {
    try {
      await GoogleSignin.hasPlayServices();
      const {accessToken, idToken} = await GoogleSignin.signIn();
      setloggedIn(true);
      const credential = auth.GoogleAuthProvider.credential(
        idToken,
        accessToken,
      );
      await auth().signInWithCredential(credential);
    } catch (error) {</code></pre><figcaption>Firebase Login function</figcaption></figure><p>Ahora hemos completado con éxito la integración de Google Sign-in en nuestra aplicación React Native:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/06/2020-06-29-17.52.16.gif" class="kg-image" alt="result of google login with react native" width="600" height="400" loading="lazy"><figcaption>result of google login with react native</figcaption></figure><p>Podemos ver nuevos datos que se agregan a Firebase Console:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/07/firebase-authentication-console.png" class="kg-image" alt="firebase authentication console" width="600" height="400" loading="lazy"><figcaption>firebase authentication console</figcaption></figure><h2 id="seguimiento-del-estado-del-usuario">Seguimiento del estado del usuario</h2><p>Para verificar el estado de inicio de sesión del usuario, usamos Firebase Auth. Para eso, necesitamos agregar el método <strong>onAuthStateChanged</strong> a <strong>useEffect</strong> para que se ejecute en cada llamada de evento <strong>componentDidMount</strong>.</p><p>Además, debemos pasar una devolución de llamada a la función denominada <strong>onAuthStateChanged</strong> como argumento, como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">useEffect(() =&gt; {
    .............
    const subscriber = auth().onAuthStateChanged(onAuthStateChanged);
    return subscriber; // unsubscribe on unmount
  }, []);</code></pre><figcaption>subscribe to auth state</figcaption></figure><p>En la función <strong>onAuthStateChanged</strong>, manejamos los datos del estado local como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">function onAuthStateChanged(user) {
    setUser(user);
    console.log(user);
    if (user) setloggedIn(true);
  }</code></pre><figcaption>set user data</figcaption></figure><p>Ahora, necesitamos almacenar los datos de usuario para el estado. Luego, intente mostrar los datos del usuario después de un inicio de sesión exitoso. Para eso, necesitamos usar la siguiente pieza de código:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">{!user &amp;&amp; &lt;Text&gt;You are currently logged out&lt;/Text&gt;}
{user &amp;&amp; (
  &lt;View&gt;
    &lt;Text&gt;Welcome {user.displayName}&lt;/Text&gt;
    &lt;Button
      onPress={this.signOut}
      title="LogOut"
      color="red"&gt;&lt;/Button&gt;
  &lt;/View&gt;
)}</code></pre><figcaption>code for display user info</figcaption></figure><p>Obtendremos el siguiente resultado en nuestro simulador:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/07/show-auth-user-name.png" class="kg-image" alt="result on show auth username" width="600" height="400" loading="lazy"><figcaption>logout firebase auth</figcaption></figure><h2 id="cerrar-sesi-n-de-firebase">Cerrar sesión de Firebase</h2><p>Para cerrar sesión, debemos eliminar todas las credenciales del usuario y revocar el token de inicio de sesión de Google.</p><p>Primero, debemos esperar a que el módulo <strong>GoogleSignin</strong> revoque el acceso y cierre la sesión. Luego, llamamos al método de <strong><strong>signOut</strong></strong> de <strong>Firebase</strong> auth para cerrar sesión con éxito.</p><p>La implementación general del código se proporciona en el siguiente fragmento de código:</p><figure class="kg-card kg-code-card"><pre><code class="language-javascript">signOut = async () =&gt; {
    try {
      await GoogleSignin.revokeAccess();
      await GoogleSignin.signOut();
      auth()
        .signOut()
        .then(() =&gt; alert('Your are signed out!'));
      setloggedIn(false);
      // setuserInfo([]);
    } catch (error) {
      console.error(error);
    }
  };</code></pre><figcaption>Firebase sign-out function</figcaption></figure><p>Como resultado, ahora podemos realizar operaciones de cierre de sesión como se muestra en el fragmento de código a continuación:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.instamobile.io/wp-content/uploads/2020/07/firebase-signout-result.gif" class="kg-image" alt="firebase react native sign out result" width="600" height="400" loading="lazy"><figcaption>firebase react native logout</figcaption></figure><h2 id="conclusion"><strong>Conclusion</strong></h2><p>En este tutorial, aprendimos a configurar Google Login, además de almacenar un token de acceso, aprovechando Firebase en nuestro proyecto React Native.</p><p>Primero, creamos el proyecto React Native con todos los componentes necesarios y configuraciones de funciones. Luego, aprendimos cómo configurar Google Sign In y Firebase para las plataformas Android e iOS. Finalmente, configuramos Firebase en la aplicación React Native usando un paquete de Firebase y mostramos los datos del usuario junto con el botón de cierre de sesión.</p><p>Puede descargar el código fuente completo de este tutorial desde <a href="https://github.com/florion101/firebase-google-login-react-native">Github</a>.</p><p>La mejor parte es que Firebase y Google Auth son compatibles con todos los lenguajes de desarrollo móvil, como <a href="https://instaflutter.com/">Flutter</a>, <a href="https://iosapptemplates.com/">Swift</a> o <a href="https://instakotlin.com/">Kotlin</a>. Los pasos de configuración y el enfoque arquitectónico son exactamente los mismos.</p><p>Si te gustó este tutorial de React Native, dame una estrella en el repositorio de <a href="https://github.com/florion101/firebase-google-login-react-native">Github</a> y compártelo con tu comunidad. Puede consultar aún más proyectos<a href="https://instamobile.io/mobile-templates/react-native-templates-free/"> React Native gratuitos</a> en Instamobile. ¡Salud!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo construir una aplicación React Native e integrarla con Firebase ]]>
                </title>
                <description>
                    <![CDATA[ En este tutorial, vamos a construir una aplicación React Native que está integrado con un backend de Firebase. La aplicación soportará tanto el CLI de React Native como el CLI de Expo. Este tutorial de React Native Firebase cubrirá las características principales como autenticación, registro, y operaciones CRUD de bases ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-construir-una-aplicacion-react-native-e-integrarla-con-firebase/</link>
                <guid isPermaLink="false">64675c42a7154006ea79e095</guid>
                
                    <category>
                        <![CDATA[ react native ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Mon, 26 Jun 2023 17:06:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/05/react-native-firebase.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/react-native-firebase-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build a React Native App and Integrate It with Firebase</a>
      </p><p>En este tutorial, vamos a construir una aplicación React Native que está integrado con un backend de Firebase. La aplicación soportará tanto el CLI de React Native como el CLI de Expo.</p><p>Este tutorial de <strong>React Native Firebase</strong> cubrirá las características principales como autenticación, registro, y operaciones CRUD de bases de datos (Firestore). </p><p>Puedes también <a href="https://github.com/instamobile/react-native-firebase">descargar todo el código abierto</a> desde Github si quieres saltar directo al código. </p><p>Este tutorial te llevará a través de los detalles de las siguientes secciones: </p><ol><li><strong><strong>Crea</strong>r<strong> </strong>un proyecto de<strong> Firebase</strong></strong></li><li><strong><strong>Crea</strong>r<strong> &amp; configur</strong>ar<strong> </strong>una nueva aplicación <strong>React Native</strong></strong></li><li><strong>Configurar<strong> </strong>la estructura de carpeta<strong>, </strong>rutas<strong>, </strong>y<strong> n</strong>avegación</strong></li><li><strong><strong>Implement</strong>ar<strong> </strong>la<strong> UI </strong>para el<strong> Login, </strong>el <strong>Registr</strong>o<strong>, </strong>y las ventanas de Inicio</strong></li><li><strong><strong>Regist</strong>ro<strong> </strong>con<strong> Firebase Auth</strong></strong></li><li><strong>Inicio de Sesión<strong> </strong>con<strong> Firebase Auth</strong></strong></li><li><strong>Credenciales de<strong> </strong>Inicio de Sesión Persistentes</strong></li><li><strong>Escribir<strong> </strong>y<strong> </strong>leer<strong> dat</strong>os<strong> </strong>desde<strong> Firebase Firestore</strong></strong></li></ol><p>Sin más, comencemos a construir el proyecto de React Native Firebase. La aplicación móvil final se verá así:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/react-native-firebase-1.png" class="kg-image" alt="react native firebase" width="600" height="400" loading="lazy"></figure><h2 id="1-crear-un-proyecto-de-firebase"><strong>1. Crear un proyecto de Firebase</strong></h2><p>Ver a <a href="https://firebase.google.com/" rel="noopener">Firebase.com</a> y crea una nueva cuenta. Una vez que inicies sesión, serás capaz de crear un nuevo proyecto en la <a href="https://console.firebase.google.com/u/0/">Consola de </a><a href="https://console.firebase.google.com/u/0/" rel="noopener">Firebase</a>.</p><ul><li>Crear una nueva cuenta en <a href="https://firebase.google.com/" rel="noopener">Firebase.com</a></li><li>Crear un nuevo proyecto en la <a href="https://console.firebase.google.com/">Consola de </a><a href="https://console.firebase.google.com/" rel="noopener">Firebase</a></li><li>Permitir método de autenticación con Email &amp; Contraseña en <em><em>Firebase Console</em></em> -&gt; <em><em>Authentication</em></em> -&gt; <em><em>Sign-in method</em></em></li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1__J2bqHTUxhs_sTxwRdbvAg.png" class="kg-image" alt="1__J2bqHTUxhs_sTxwRdbvAg" width="600" height="400" loading="lazy"></figure><ul><li>Crear una nueva aplicación iOS, con el ID App <em><em>com.reactnativefirebase</em></em></li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_RFyy5eHgUlZIEQtaCj5ddA.png" class="kg-image" alt="1_RFyy5eHgUlZIEQtaCj5ddA" width="600" height="400" loading="lazy"></figure><ul><li>(Opcional) Crear una nueva aplicación Android con el nombre de paquete <em><em>com.reactnativefirebase</em></em></li><li>Descargar el archivo de configuración generado en el siguiente paso a tu computadora (<em><em>GoogleService-Info.plist</em></em> para iOS, y <em><em>google-services.json</em></em> para Android)</li></ul><p>Firebase te permite construir aplicaciones <em>sin backend</em>. Es un producto que corre sobre la Nube de Google, y permite a los desarrolladores construir aplicaciones web y móviles sin necesidad de tener sus propios servidores.</p><p>Esto ahorra mucho tiempo, ya que no necesitas escribir ningún código de backend. Es altamente escalable también, siendo soportado por la infraestructura de Google.</p><p>En Firebase, serás capaz de almacenar todo lo que es necesario para tu aplicación – usuarios, datos, archivos, enviar tokens de notificación, etc. Toda esta información se hace disponible a los clientes móviles via los SDKs de Firebase, lo cuales son compatibles con React Native. Esto significa que todas las interacciones con el backend son abstraídos y encapsulados en el SDK, así los desarrolladores móviles se preocupen sobre llamadas API, conversiones de datos, gestión de sockets, y así sucesivamente.</p><h2 id="2-crear-y-configurar-una-nueva-aplicaci-n-react-native"><strong><strong><strong>2. </strong></strong>Crear<strong><strong> </strong></strong>y configurar<strong><strong> </strong></strong>una nueva aplicación<strong><strong> React Native</strong></strong></strong></h2><p>Vamos a hacer nuestra aplicación React Native con Firebase compatible tanto con el CLI de Expo como con el CLI de React Native.</p><p>Vamos a usar Expo por ahora, ya que lo hace fácil a los principiantes para previsualizar sus aplicaciones. Pero no usaremos ninguna librería específica de Expo, así que el código de <em>src</em> puedes ser simplemente usado en cualquier aplicación de React Native, sin importar de su estructura.</p><p>Vamos a usar el <a href="https://firebase.google.com/docs/reference/js">SDK Web de Firebase</a>, el cual es compatible con Expo y con el CLI de React Native, y es soportado directamente por Google. </p><p>Si quieres usar <a href="https://rnfirebase.io/" rel="noopener">react-native-firebase</a>, siéntete libre de instalarlo y configurarlo (el código aún será el mismo). Pero ten en mente que no lo recomiendo por unas pocas razones:</p><ul><li>no está soportado directamente por Google, así que mantenerlo serás más duro dado que es una capa extra que puede causar errores, y</li><li>tampoco funciona con Expo, lo que puedes ser un factor decisivo para muchos desarrolladores.</li></ul><p>Los pasos abajo están también cubiertos en la documentación oficial de React Native en <a href="https://reactnative.dev/docs/environment-setup" rel="noopener">como configurar tu entorno de desarrollo</a>.</p><ul><li>Instalar el CLI de Expo</li></ul><p>En tu Terminal, simplemente ejecuta</p><pre><code class="language-bash">npm install -g expo-cli</code></pre><ul><li>Crea una nueva aplicación React Native ejecutando</li></ul><pre><code class="language-bash">expo init react-native-firebase
</code></pre><p>Para la plantilla, elige el <em><em>Managed Workflow</em></em> — <em><em>Blank</em></em></p><ul><li>Comienza la aplicación ejecutando</li></ul><pre><code class="language-bash">yarn ios
// or
yarn android
</code></pre><p>Esto también te presentará con un código QR el cual puedes escanear usando la aplicación Cámara en iOS, o la aplicación Expo en Android.</p><p>Esto es genial. Ahora tenemos una nueva aplicación React Native, ejecutándose tanto en iOS como en Adroid. Empecemos conectándolo a tu backend de Firebase. </p><ul><li>Agregar el SDK de Firebase al proyecto de React Native</li></ul><pre><code class="language-bash">yarn add firebase
</code></pre><ul><li>Agregar la librería de Navegación de React Native Navigation ejecutando</li></ul><pre><code class="language-bash">yarn add @react-navigation/native &amp;&amp; yarn add @react-navigation/stack &amp;&amp; expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view</code></pre><ul><li>Agregar varios componentes UI y paquetes a ser usados en el proyecto</li></ul><pre><code>yarn add react-native-keyboard-aware-scroll-view base-64
</code></pre><p>Crear un archivo de configuración de Firebase</p><pre><code class="language-bash">mkdir src src/firebase &amp;&amp; touch src/firebase/config.js</code></pre><p>Agregar tu configuración de Firebase en <em><em>src/firebase/config.js:</em></em></p><pre><code class="language-jsx">import * as firebase from 'firebase';
import '@firebase/auth';
import '@firebase/firestore';

const configuracionFirebase = {
  claveAPI: 'TU_CLAVE_AQUI_AIzasyAOWH',
  dominioAuth: 'tu-dominio-auth-b1234.firebaseapp.com',
  urlBaseDeDatos: 'https://tu-nombre-basededatos-firebaseio.com',
  idProyecto: 'tu-id-proyecto-1234',
  presupuestoAlmacenamiento: 'tu-id-proyecto-1234.appspot.com',
  idRemitenteMensajes: '12345-insertar-tuyo',
  idApp: 'inserta el tuyo: 1:1234:web:ee873bdu1234codeb7eba61ce',
 }
 
 if (!firebase.apps.length) {
 	firebase.initializeApp(configuracionFirebase);
 }
 
 export {firebase};</code></pre><p>Puedes obtener toda esta información desde <a href="https://console.firebase.google.com/" rel="noopener">Firebase Console</a> -&gt; Project Settings</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_RU6D6YeIhpIprROu8lmOOw.png" class="kg-image" alt="1_RU6D6YeIhpIprROu8lmOOw" width="600" height="400" loading="lazy"></figure><h2 id="3-crear-la-estructura-de-carpeta-y-configurar-las-rutas-y-la-navegaci-n"><strong>3. Crear la estructura de carpeta y configurar las rutas y la navegación</strong></h2><ul><li>Crea la estructura de carpeta ejecutando</li></ul><pre><code class="language-bash">mkdir src/screens src/screens/LoginScreen src/screens/RegistrationScreen src/screens/HomeScreen</code></pre><ul><li>Crea la estructura de archivos ejecutando</li></ul><pre><code class="language-bash">touch src/screens/index.js src/screens/LoginScreen/LoginScreen.js src/screens/LoginScreen/styles.js src/screens/RegistrationScreen/RegistrationScreen.js src/screens/styles.js src/screens/HomeScreen/HomeScreen.js src/screens/HomeScreen/styles.js</code></pre><ul><li>Agrega este código a <em><em>src/screens/index.js</em></em></li></ul><pre><code class="language-jsx">export { default as LoginScreen } from './LoginScreen/LoginScreen'

export { default as HomeScreen } from './HomeScreen/HomeScreen'

export { default as RegistrationScreen } from './RegistrationScreen/RegistrationScreen'
</code></pre><p>¡No te preocupes si el proyecto está roto! Todo tendrá sentido en un ratito.</p><ul><li>Configurar las rutas &amp; navegadores</li></ul><p>Sobreescribe el archivo <em><em>App.js</em></em> con el siguiente fragmento de código:</p><pre><code class="language-jsx">import 'react-native-gesture-handler';
import React, { useEffect, useState } from 'react';
import { NavigationContainer } from '@react-navigation/natie';
import { createStackNavigator } from '@react-navigation/stack';
import { LoginScreen, HomeScreen, RegistrationScreen } from './src/screens';
import { decode, encode } from 'base-64';

if (!global.btoa) { global.btoa = encode }
if (!global.atob) { global.atob = decode }

const Stack = createStackNavigator();

export default function App() {
  const [loading, setLoading] = useState(true);
  const [user, setUser] = useState(null);
  
  return (
    &lt;NavigationContainer&gt;
      &lt;Stack.Navigator&gt;
        {  user? (
          &lt;Stack.Screen name="Home"&gt;
            {props =&gt; &lt;Homescreen {...props} extraData={user} /&gt;}
          &lt;/Stack.Screen&gt;
          ) : (
            &lt;&gt;
              &lt;Stack.Screen name="Login" component={LoginScreen} /&gt;
              &lt;Stack.Screen name="Registration" component={RegistrationScreen} /&gt;
            &lt;/&gt;
          )}
      &lt;/Stack.Navigator&gt;
    &lt;/NavigationContainer&gt;
  );
}</code></pre><h2 id="4-implementar-la-ui"><strong>4. Implementar la UI</strong></h2><p>Ahora que tenemos la estructura de la aplicación, vamos a continuar hacia adelante e implementemos los componentes UI de todas las pantallas. No vamos a ir en detalle sobre el diseño flex y el diseño de React Native, ya que está fuera del enfoque para este tutorial. Vamos a enfocarnos mayormente en la integración de React Native con Firebase.</p><p>Simplemente sobreescribe los archivos como sigue:</p><ul><li>src/LoginScreen/LoginScreen.js</li></ul><pre><code class="language-jsx">import React, { useState } from 'react'
import { Image, Text, TextInput, TouchableOpacity, View } from 'react-native'
import { KeyboardAdwareScrollView } from 'react-native-keyboard-aware-scroll-view'
import styles from './styles'

export default function LoginScreen({ navigation }) {
  const [email, setEmail] = useState('')
  const [password, setPassword] = useState('')
  
  const onFooterLinkPress = () =&gt; {
    navigation.navigate('Registration')
  }
  
  const onLoginPress = () =&gt; {
  }
  
  return (
    &lt;View style={styles.container}&gt;
      &lt;KeyboardAwareScrollView
        style={{ flex: 1, width: '100%' }}
        keyboardShouldPersistTaps="always"&gt;
        &lt;Image
          style={styles.logo}
          source={require('../../../assets/icon.png')}
        /&gt;
        &lt;TextInput
          style={styles.input}
          placeholder="E-mail"
          placeholderTextColor="#aaa"
          onChangeText={(text) =&gt; setEmail(text)}
          value={email}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        /&gt;
        &lt;TextInput
          style={styles.input}
          placeholderTextColor="#aaa"
          secureTextEntry
          placeholder="Password"
          onChangeText={(text) =&gt; setPassword(text)}
          value={password}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        /&gt;
        &lt;TouchableOpacity
          style={styles.button}
          onPress={() =&gt; onLoginPress()}&gt;
          &lt;Text style={styles.buttonTitle}&gt;Log in&lt;/Text&gt;
        &lt;/TouchableOpacity&gt;
        &lt;View style={styles.footerView}&gt;
          &lt;Text style={styles.footerText}&gt;Don't have an account? &lt;Text onPress={onFooterLinkPress} style={styles.footerLink}&gt;Sign up&lt;/Text&gt;&lt;/Text&gt;
        &lt;/View&gt;
      &lt;/KeyboardAwareScrollView&gt;
    &lt;/View&gt;
  )
}</code></pre><ul><li>src/LoginScreen/styles.js</li></ul><pre><code class="language-jsx">import { StyleSheet } from 'react-native'

export default StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center'
  },
  title: {
  
  },
  logo: {
    flex: 1,
    height: 120,
    width: 90,
    alignSelf: "center",
    margin: 30
  },
  input: {
    height: 48,
    borderRadius: 5,
    overflow: 'hidden',
    backgroundColor: 'white',
    marginTop: 10,
    marginBottom: 10,
    marginLeft: 30,
    paddingLeft: 16
  },
  button: {
    backgroundColor: '#788eec',
    marginLeft: 30,
    marginRight: 30,
    marginTop: 20,
    height: 48,
    borderRadius: 5,
    alignItems: 'center',
    justifyContent: 'center'
  },
  buttonTitle: {
    color: 'white',
    fontSize: 16,
    fontWeight: 'bold'
  },
  footerView: {
    flex: 1,
    alignItems: 'center',
    marginTop: 20
  },
  footerText: {
    fontSize: 16,
    color: '#2e2e2d'
  },
  footerLink: {
    color: '#788eec',
    fontWeight: 'bold',
    fontSize: 16
})</code></pre><ul><li>src/RegistrationScreen/RegistrationScreen.js</li></ul><pre><code class="language-jsx">import React, { useState } from 'react'
import { Image, Text, TextInput, TouchableOpacity, View } from 'react-native'
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
import styles from './styles';

export default function RegistrationScreen({ navigation }) {
  const [fullName, setFullName] = useState('')
  const [email, setEmail] = useState('')
  const [password, setPassword] = useState('')
  const [confirmPassword, setConfirmPassword] = useState('')
  
  const onFooterLinkPress = () =&gt; {
    navigation.navigate('Login')
  }
  
  const onRegisterPress = () =&gt; {
  
  }
  
  return (
    &lt;View style={styles.container}&gt;
      &lt;KeyboardAwareScrollView
        style={{ flex: 1, width: '100%' }}
        keyboardShouldPersistTaps="always"&gt;
        &lt;Image
          style={styles.logo}
          source={require('../../../assets/icon.png')}
        /&gt;
        &lt;TextInput
          style={styles.input}
          placeholder="Fullname"
          placeholderTextColor="#aaa"
          onChangeText={(text) =&gt; setFullName(text)}
          value={fullName}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        /&gt;
        &lt;TextInput
          style={styles.input}
          placeholder="Email"
          placeholderTextColor="#aaa"
          onChangeText={(text) =&gt; setEmail(text)}
          value={email}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        /&gt;
        &lt;TextInput
          style={styles.input}
          placeholderTextColor="#aaa"
          secureTextEntry
          placeholder="Password"
          onChangeText={(text) =&gt; setPassword(text)}
          value={password}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        /&gt;
        &lt;TextInput
          style={styles.input}
          placeholderTextColor="#aaa"
          secureTextEntry
          placeholder="Confirm Password"
          onChangeText={(text) =&gt; setConfirmPassword(text)}
          value={confirmPassword}
          underlineColorAndroid="transparent"
          autoCapitalize="none"
        /&gt;
        &lt;TouchableOpacity
          style={styles.button}
          onPress={() =&gt; onRegisterPress()}&gt;
          &lt;Text style={styles.buttonTitle}&gt;Create account&lt;/Text&gt;
        &lt;/TouchableOpacity&gt;
        &lt;View style={styles.footerView}&gt;
          &lt;Text style={styles.footerText}&gt;Already got an account? &lt;Text onPress={onFooterLinkPress} style={styles.footerLink}&gt;Log in&lt;/Text&gt;&lt;/Text&gt;
        &lt;/View&gt;
      &lt;/KeyboardAwareScrollView&gt;
    &lt;/View&gt;
  )
}</code></pre><ul><li>src/RegistrationScreen/styles.js</li></ul><pre><code class="language-jsx">import { StyleSheet } from 'react-native'

export default StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center'
  },
  title: {
  
  },
  logo: {
    flex: 1,
    height: 120,
    width: 90,
    alignSelf: 'center',
    margin: 30
  },
  input: {
    height: 48,
    borderRadius: 5,
    overflow: 'hidden',
    backgroundColor: 'white',
    marginTop: 10,
    marginBottom: 10,
    marginRight: 30,
    paddingLeft: 16
  },
  button: {
    backgroundColor: '#788eec',
    marginLeft: 30,
    marginRight: 30,
    marginTop: 20,
    height: 48,
    borderRadius: 5,
    alignItems: 'center',
    justifyContent: 'center',
  },
  buttonTitle: {
    color: 'white',
    fontSize: 16,
    fontWeight: 'bold'
  },
  footerView: {
    flex: 1,
    alignItems: 'center',
    marginTop: 20
  },
  footerText: {
    fontSize: 16,
    color: '#2e2e2d'
  },
  footerLink: {
    color: '#788eec',
    fontWeight: 'bold',
    fontSize: 16
  }
})</code></pre><ul><li>src/HomeScreen/HomeScreen.js</li></ul><pre><code class="language-jsx">import React from 'React'
import { Text, View } from 'react-native'

export default function HomeScreen(props) {
  return (
    &lt;View&gt;
      &lt;Text&gt;Home Screen&lt;/Text&gt;
    &lt;/View&gt;
  )
}</code></pre><ul><li>src/HomeScreen/styles.js</li></ul><pre><code class="language-jsx">import { StyleSheet } from 'react-native'

export default StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center'
  },
  input: {
    height: 48,
    borderRadius: 5,
    overflow: 'hidden',
    backgroundColor: 'white',
    marginTop: 10,
    marginBottom: 10,
    marginLeft: 30,
    marginRight: 30,
    paddingLeft: 16
  }
})</code></pre><p>A este punto, tu aplicación debería ejecutarse apropiadamente y mostrar las siguientes pantallas (UI solamente):</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_rwQyQ3ZCE7rgHukTAeLliw.png" class="kg-image" alt="react native firebase auth" width="600" height="400" loading="lazy"></figure><p>Puedes cambiar entre las dos pantallas tocando los botones de enlaces en el pie de página.</p><p>Ahora que tenemos una UI hermosa para iniciar sesión y registrarse, veamos cómo podemos integrar nuestra aplicación React Native (y Expo) con Firebase.</p><h2 id="5-react-native-con-firebase-registro"><strong>5. React Native con Firebase — Registro</strong></h2><p>Empecemos con crear una nueva cuenta con Firebase Auth, ya que naturalmente el inicio de sesión viene después. Para esto, vamos a agregar la lógica de Firebase para crear una nueva cuenta con email &amp; contraseña en el <em>RegistrationScreen.js</em>, implementando el método <em>onRegisterPress</em> como sigue:</p><pre><code class="language-jsx">// ... El mismo código de antes continúa y agregamos 
import { firebase } from "../../firebase/config"
// ...

export default function RegistrationScreen({ navigation }) {
  // ... El mismo código de antes continúa y agregamos
  const onRegisterPress = () =&gt; {
    if (password !== confirmPassword) {
      alert("Passwords don't match."),
      return
    }
    firebase
      .auth()
      .createUserWithEmailAndPassword(email, password)
      .then((response) =&gt; {
        const uid = response.user.uid
        const data = {
          id: uid,
          email,
          fullName
        },
        const usersRef = firebase.firestore().collection('users')
        usersRef
          .doc(uid)
          .set(data)
          .then(() =&gt; {
            navigation.navigate('Home', { user: data })
          })
          .catch((error) =&gt; {
            alert(error)
          })
        })
        .catch((error) =&gt; {
          alert(error)
        }
      })
    }
    // ...
}</code></pre><p>En el flujo de creación de cuenta de arriba, hacemos un par de cosas importantes: </p><ul><li>Llamamos a la API <em>createUserWithEmailAndPassword</em> de Auth de Firebase (línea 13), el cual crea una nueva cuenta que se mostrará en Firebase Console -&gt; Authentication table.</li><li>Si el registro de la cuenta fue exitosa, también almacenamos los datos del usuario en el Firestore &nbsp;de Firebase (línea 24). Esto es necesario para almacenar información extra del usuario, tal como el nombre completo, URL de la foto de perfil, y así sucesivamente, el cual no puede ser almacenado en la tabla de Autenticación.</li><li>Si el registro fue exitoso, navegamos al Home Screen, pasando los datos del objeto del usuario también.</li><li>Si algún error ocurre, simplemente lo mostramos en una alerta. Los errores pueden ser cosas como conexión de red, contraseñas demasiadas cortas, email inválido, y así sucesivamente.</li></ul><p>Recarga tu aplicación y prueba el registro. Si creó una cuenta exitosamente, verifícalo si se muestra en <em><em>Firebase Console</em></em> -&gt; <em><em>Authentication</em></em>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_qy_k5wsgw4MAALmIeBxYpg.png" class="kg-image" alt="1_qy_k5wsgw4MAALmIeBxYpg" width="600" height="400" loading="lazy"></figure><h2 id="6-react-native-con-firebase-inicio-de-sesi-n"><strong>6. React Native con Firebase — Inicio de sesión</strong></h2><p>Ahora que somos capaz de crear nuevas cuentas, implementemos la funcionalidad de iniciar sesión. El SDK de Firebase se encarga de todos los pasos de autorización y autenticación para un inicio de sesión seguro.</p><p>Abre <em>LoginScreen.js</em>, importa Firebase y completa el método <em>onLoginPress:</em></p><pre><code class="language-jsx">...
import { firebase } from '../../firebase/config'
...

export default function LoginScreen({ navigation }) {
  ...
  const onLoginPress = () =&gt; {
    firebase
      .auth()
      .signInWithEmailAndPassword(email, password)
      .then((response) =&gt; {
        const uid = response.user.uid
        const usersRef = firebase.firestore().colecction('users')
        usersRef
          .doc(uid)
          .get()
          .then(firestoreDocument =&gt; {
            if (!firestoreDocument.exists) {
              alert("User does not exist anymore".)
              return;
            }
            const user = firestoreDocument.data()
            navigation.navigate('Home', {user})
          })
          .catch(error =&gt; {
            alert(error)
          })
        })
      .catch(error =&gt; {
        alert(error)
      })
  }
  ...
}</code></pre><p>Recarga tu aplicación y ve hacia adelante e inicia sesión con una cuenta existente. La aplicación debería llevarte a la pantalla de inicio si las credenciales eran correctas, o te alertará con un error si algo anduvo mal. </p><h2 id="7-persistir-las-credenciales-de-inicio-de-sesi-n"><strong>7. Persistir las credenciales de inicio de sesión</strong></h2><p>Notarás que si quitas las aplicación y lo abres nuevamente, te mostrará la pantalla de inicio de sesión otra vez. Para una buena experiencia de usuario, nos gustaría que lleguen todos los usuarios que iniciarion sesión en la pantalla de Inicio. Nadie quiere escribir sus credenciales de inicio de sesión cada vez que quiera usar la aplicación.</p><p>Esto se conoce también com inicio de sesión persistente. Afortunadamente, el SDK de Firebase se encarga de esto por nosotros, con todas las preocupaciones de seguridad. El inicio de sesión persistente está activado por defecto en Firebase, así que todo lo que necesitamos es buscar al usuario que inicio sesión actualmente.</p><p>Abre el <em><em>App.js</em></em> e implementemos la característica de inicio de sesión persistente:</p><pre><code class="language-jsx">...
import { firebase } from './src/firebase/config'
...

export default function App() {
  ...
  if (loading) {
    return (
      &lt;&gt;&lt;/&gt;
    )
  }
  
  useEffect(() =&gt; {
    const usersRef = firebase.firestore().collection('users)
    firebase.auth().onAuthStateChanged(user =&gt; {
      if (user) {
        usersRef
          .doc(user.uid)
          .get()
          .then((document) =&gt; {
            const userData = document.data()
            setLoading(false)
            setUser(userData)
          })
          .catch((error) =&gt; {
            setLoading(false)
          })
      else {
        setLoading(false)
      }
    })
  }, [])
  ...
}</code></pre><p><em>onAuthStateChanged</em> regresa el usuario que inició sesión recientemente. Después buscamos todos los datos extra del usuario que almacenamos en Firestore, y lo ponemos en el estado del componente actual. Esto re-rendizará el componente app, el cual mostrará la pantalla de Inicio.</p><p>Nota cómo lo llamamos la primera vez que carga la aplicación al aprovechar el hook <a href="https://es.react.dev/reference/react/useEffect">useEffect</a>.</p><h2 id="8-escribir-y-leer-datos-del-firestore-de-firebase"><strong>8. Escribir y leer datos del Firestore de Firebase </strong></h2><p>Ya hemos usado Firestore arriba, para guardar información extra de nuestros usuarios (el nombre completo). En esta sección dedicada, vamos a ver cómo podemos escribir los datos a Firestore, y cómo podemos consultarla.</p><p>También cubriremos cómo observar (escuchar) los cambios en la colección de Firestore y que se reflejen en la pantalla, en tiempo real. Estos pueden ser muy útiles en aplicaciones de tiempo real, tal como <a href="https://instamobile.io/app-templates/video-chat-app-in-react-native/">React Native Chat</a>.</p><p>Para simplificar, vamos a guardar algunos items de texto en una colección de Firestore llamado "entidades". Considéralos como tareas, posts, tweets, lo que gustes. Crearemos una archivo simple que agrega una nueva entidad y también listaremos todas las entidades que pertenecen al usuario que inició sesión recientemente. Además, la lista será actualizada en tiempo real.</p><ul><li>Implementar HomeScreen.js reescribiéndolo al código de abajo</li></ul><pre><code class="language-jsx">import React, { useEffect, useState } from 'react'
import { FlatList, Keyboard, Text, TextInput, TouchableOpacity, View } from 'react-native'
import styles from './styles'
import { firebase } from '../../firebase/config'

export default function HomeScreen(props) {
  const [entityText, setEntityText] = useState('')
  const [entities, setEntities] = useState([])
  
  const entityRef = firebase.firestore().collection('entities')
  const userID = props.extraData.id
  
  useEffect(() =&gt; {
    entityRef
      .where("author ID", "==", userID)
      .orderBy('createdAt', 'desc')
      .onSnapshot(
        querySnapshot =&gt; {
          const newEntities = []
          querySnapshot.forEach(doc =&gt; {
            const entity = doc.data()
            entity.id = doc.id
            newEntities.push(entity)
          })
          setEntities(newEntities)
        },
        error =&gt; {
          console.log(error)
        }
      }
    }, [])
    
    const onAddButtonPress = () =&gt; {
      if (entityText &amp;&amp; entityText.length &gt; 0) {
        const timestamp = firebase.firestore.FieldValue.serverTimestamp()
        const data = {
          text: entityText,
          authorID: userID,
          createdAt: timestamp,
        }
        entityRef
          .add(data)
          .then(_doc =&gt; {
            setEntityText('')
            Keyboard.dismiss()
          })
          .catch((error) =&gt; {
            alert(error)
          })
      }
    }
    
    const renderEntity = ({item, index}) =&gt; {
      return (
        &lt;View style={styles.entityContainer}&gt;
          &lt;Text style={styles.entityText}&gt;
            {index}. {item.text}
          &lt;/Text&gt;
        &lt;/View&gt;
      )
    }
    
    return (
      &lt;View style={styles.container}&gt;
        &lt;View style={styles.formContainer}&gt;
          &lt;TextInput
            style={styles.input}
            placeholder="Add new entity"
            placeholderTextColor="#aaa"
            onChangeText={(text) =&gt; setEntity(text)}
            value={entityText}
            underlineColorAndroid="transparent"
            autoCapitalize="none"
          /&gt;
          &lt;TouchableOpacity style={styles.button} onPress={onAddButtonPress}&gt;
            &lt;Text style={styles.buttonText}&gt;Add&lt;/Text&gt;
          &lt;/TouchableOpacity&gt;
        &lt;/View&gt;
        { entities &amp;&amp; (
          &lt;View style={styles.listContainer}&gt;
            &lt;FlatList
              data={entities}
              renderItem={renderEntity}
              keyExtractor={(item) =&gt; item.id}
              removeClippedSubviews={true}
            /&gt;
          &lt;/View&gt;
        )}
      &lt;/View&gt;
    )
}</code></pre><ul><li>Estilo de la pantalla inicio, sobreescribiendo <em><em>HomeScreen/styles.js</em></em> a:</li></ul><pre><code class="language-jsx">import { StyleSheet } from 'react-native'

export default StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center'
  },
  formContainer: {
    flexDirection: 'row',
    height: 80,
    marginTop: 40,
    marginBottom: 20,
    flex: 1,
    paddingTop: 10,
    paddingBottom: 10,
    paddingLeft: 30,
    paddingRight: 30,
    justifyContent: 'center'
    alignItems: 'center'
  },
  input: {
    height: 48,
    borderRadius: 5,
    overflow: 'hidden',
    backgroundColor: 'white',
    paddingLeft: 16,
    flex: 1,
    marginRight: 5
  },
  button: {
    height: 47,
    borderRadius; 5,
    backgroundColor: '#788eec',
    width: 80,
    alignItems: 'center',
    justifyContent: 'center'
  },
  buttonText: {
    color: 'white',
    fontSize: 16
  },
  listContainer: {
    marginTop: 20,
    padding: 20
  },
  entityContainer: {
    marginTop: 16,
    borderBottomColor: '#ccc',
    borderBottomWidth: 1,
    paddingBottom: 16
  },
  entityText: {
    fontSize: 20,
    color: '#333'
  }
})</code></pre><ul><li>Recargar la aplicación y observa la nueva pantalla de inicio. Escribe algún texto y presiona el botón <em>Agregar</em></li><li>Nada sucedió.</li><li>Crea un índice en la colección entidades de Firestore</li></ul><p>Notarás que la lista de entidades no se renderiza. Si chequeas los mensajes, verás una advertencias sobre "La consulta requiere un índice", seguido de una URL larga:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_bfOrtReOOo9B_pDR4_Zm9w.png" class="kg-image" alt="1_bfOrtReOOo9B_pDR4_Zm9w" width="600" height="400" loading="lazy"></figure><p>Esto nos informa que no podemos consultar la tabla de entidades por <em>authorID</em> y ordenar los datos por <em>createdAt</em> en orden descendente, a menos que creemos un índice. Crear un índice es en realidad realmente fácil – simplemente hacer click en esa URL y luego hacer click en el botón:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_72kARyPWnDypbCko7e4U1Q.png" class="kg-image" alt="1_72kARyPWnDypbCko7e4U1Q" width="600" height="400" loading="lazy"></figure><ul><li>Recarga la aplicación nuevamente</li></ul><p>Ahora todo funciona como se espera:</p><ul><li>La aplicación lista todas las entidades en la colección de entidades, en orden de creación descendiente</li><li>Agregar una nueva entidad funciona bien</li><li>La lista se actualiza en tiempo real (intenta eliminar una entrada directamente en la base de datos, o agrega una nueva directamente desdes la aplicación)</li></ul><p>Asi es como tu base de datos de Firestore luce ahora:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/1_zPT7lLNr6kvtdazgN50eKg.png" class="kg-image" alt="1_zPT7lLNr6kvtdazgN50eKg" width="600" height="400" loading="lazy"></figure><p>Así es cómo lees y esribes desde Firestore in React Native. Movámonos a la última sección.</p><p>Juega con la aplicación, agregando nuevas entidades. Este es el proyecto final:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/05/react-native-firebase-2.png" class="kg-image" alt="react-native-firebase-2" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n"><strong><strong><strong>Conclusi</strong></strong>ó<strong><strong>n</strong></strong></strong></h2><p>Firebase lo hace realmente sencillo al agregar autenticación y soporte de base de datos a cualquier aplicación React Native. El SDK de Firebase es extremadamente poderoso, soportando muchos patrones de base de datos de lectura y escritura.</p><p>Además a React Native, el SDK de Firebase provee soporte a muchísimos otros lenguajes, tales como <a href="https://www.iosapptemplates.com/blog/swift-programming/firebase-swift-tutorial-login-registration-ios">Swift</a>, <a href="https://www.instakotlin.com/templates/android-starter-kit-with-firebase/">Kotlin</a> o <a href="https://www.instaflutter.com/app-templates/flutter-login-screen/">Flutter</a>. Visita esos links para kits de inicio similares en varios lenguajes.</p><p>Hemos exhibido lo más básico en tutorial de React Native Firebase. En la próxima serie, cubriremos características más avanzadas, tales como Firebase Storage (subir archivos) y mostrar notificaciones.</p><p>Si te gustó este tutorial, por favor dame una estrella en el <a href="https://github.com/instamobile/react-native-firebase">repo de Github</a> y compártelo con tu comunidad. Puedes chequear más <a href="https://www.instamobile.io/mobile-templates/react-native-templates-free/">proyectos gratis de React Native</a> en Instamobile. ¡Saludos!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo crear una aplicación de calculadora usando React Native: un tutorial paso a paso ]]>
                </title>
                <description>
                    <![CDATA[ Una aplicación de calculadora es una aplicación simple que siempre está disponible en todos los dispositivos Android, iOS y de escritorio. En este artículo, crearemos una aplicación de calculadora utilizando React Native y Expo. Entonces, ¿por qué estamos usando estas herramientas? React Native es un marco basado en JavaScript que ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-crear-una-aplicacion-de-calculadora-usando-reac-native-tutorial-paso-a-paso/</link>
                <guid isPermaLink="false">63fe37582154fe0736d61f38</guid>
                
                    <category>
                        <![CDATA[ react native ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ CipherBoB ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 16:31:02 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/03/banner---how-to-build-calculator-app-using-react-native-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-build-a-calculator-app-using-react-native-a-step-by-step-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build a Calculator App Using React Native – A Step-by-Step Tutorial</a>
      </p><p>Una aplicación de calculadora es una aplicación simple que siempre está disponible en todos los dispositivos Android, iOS y de escritorio.</p><p>En este artículo, crearemos una aplicación de calculadora utilizando React Native y Expo. Entonces, ¿por qué estamos usando estas herramientas?</p><p>React Native es un marco basado en JavaScript que se puede usar para desarrollar aplicaciones móviles en dos sistemas operativos al mismo tiempo: Android e iOS. React Native fue lanzado por primera vez en 2015 por Facebook y es de código abierto.</p><p>Puedes encontrar más información sobre React Native <a href="https://reactnative.dev/docs/getting-started" rel="noopener">aquí</a>.</p><p>Expo es un conjunto de herramientas, bibliotecas y servicios que puede usar para simplificar su código React Native. Entonces puede ejecutar aplicaciones React Native en el emulador Expo.</p><p>Puedes encontrar más información sobre Expo <a href="https://expo.dev/" rel="noopener">aquí</a>.</p><p>Antes de comenzar a crear una aplicación de calculadora, primero deberás instalar Node.js, React Native y Expo en tu ordenador.</p><h3 id="requisitos-previos"><strong>Requisitos previos</strong></h3><ol><li>Instala Node.js: Puedes ver cómo instalarlo <a href="https://nodejs.org/en/download/" rel="noopener">aquí</a>.</li><li>Instala React Native: Puedes ver la documentación de instalación <a href="https://reactnative.dev/docs/environment-setup" rel="noopener">aquí</a>.</li><li>Instala Expo: Puedes ver la documentación de instalación <a href="https://reactnative.dev/docs/environment-setup" rel="noopener">aquí</a>.</li></ol><h2 id="paso-1-crear-un-nuevo-proyecto"><strong>Paso 1: Crear un nuevo proyecto</strong></h2><p>El primer paso es crear un nuevo proyecto. Usa Expo CLI para crear la base de código React Native con el siguiente comando:</p><pre><code class="language-bash">$ expo init calculator-app</code></pre><p>Entonces tendrás la opción de iniciar el proyecto que desees. Aquí elegimos la opción en blanco y usamos JavaScript como se muestra a continuación:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-349.png" class="kg-image" alt="image-349" width="600" height="400" loading="lazy"><figcaption>choose template expo project</figcaption></figure><p>Después de eso, el proceso continuará descargando todas las dependencias.</p><h2 id="paso-2-crear-el-componente-de-bot-n"><strong>Paso 2: Crear el componente de botón</strong></h2><p>Cuando desarrolles aplicaciones con React Native, asegúrate de dividir los componentes de la interfaz de usuario en componentes más pequeños para que el código que crees se pueda reutilizar.</p><p>Primero, crea una nueva carpeta llamada "<strong><strong>componentes</strong></strong>" para almacenar el código de tu componente. El primer componente que crearemos es un botón, así que crea un nuevo archivo llamado <strong><strong>Button.js</strong></strong>. Aquí está el código fuente para el componente Botón:</p><pre><code class="language-javascript">import { Dimensions, StyleSheet, Text, TouchableOpacity } from "react-native";

export default ({ onPress, text, size, theme }) =&gt; {
  const buttonStyles = [styles.button];
  const textStyles = [styles.text];

  if (size === "double") {
    buttonStyles.push(styles.buttonDouble);
  }

  if (theme === "secondary") {
    buttonStyles.push(styles.buttonSecondary);
    textStyles.push(styles.textSecondary);
  } else if (theme === "accent") {
    buttonStyles.push(styles.buttonAccent);
  }

  return (
    &lt;TouchableOpacity onPress={onPress} style={buttonStyles}&gt;
      &lt;Text style={textStyles}&gt;{text}&lt;/Text&gt;
    &lt;/TouchableOpacity&gt;
  );
};</code></pre><p>Explicación del código:</p><ul><li>En la línea 3, hay cuatro propiedades que necesitamos para hacer este componente Botón: onPress, texto, tamaño y tema.</li><li>Cada una de las propiedades tiene una función como onPress para manejar acciones en los botones.</li><li>El componente de botón que creamos tiene 2 tipos de temas, secundarios y de acento, y 1 tamaño, doble.</li><li>El componente de botón usa el componente React Native predeterminado, TouchableOpacity.</li></ul><p>Después de crear el código del componente, no olvides agregar el estilo para este componente de botón. Aquí está el código para el estilo del componente:</p><pre><code class="language-javascript">// set dimmenstion
const screen = Dimensions.get("window");
const buttonWidth = screen.width / 4;

const styles = StyleSheet.create({
  button: {
    backgroundColor: "#333333",
    flex: 1,
    height: Math.floor(buttonWidth - 10),
    alignItems: "center",
    justifyContent: "center",
    borderRadius: Math.floor(buttonWidth),
    margin: 5,
  },
  text: {
    color: "#fff",
    fontSize: 24,
  },
  textSecondary: {
    color: "#060606",
  },
  buttonDouble: {
    width: screen.width / 2 - 10,
    flex: 0,
    alignItems: "flex-start",
    paddingLeft: 40,
  },
  buttonSecondary: {
    backgroundColor: "#a6a6a6",
  },
  buttonAccent: {
    backgroundColor: "#ffc107",
  },
});
</code></pre><p>Entonces, el código completo de nuestro componente de botón es el siguiente:</p><pre><code class="language-javascript">import { Dimensions, StyleSheet, Text, TouchableOpacity } from "react-native";

export default ({ onPress, text, size, theme }) =&gt; {
  const buttonStyles = [styles.button];
  const textStyles = [styles.text];

  if (size === "double") {
    buttonStyles.push(styles.buttonDouble);
  }

  if (theme === "secondary") {
    buttonStyles.push(styles.buttonSecondary);
    textStyles.push(styles.textSecondary);
  } else if (theme === "accent") {
    buttonStyles.push(styles.buttonAccent);
  }

  return (
    &lt;TouchableOpacity onPress={onPress} style={buttonStyles}&gt;
      &lt;Text style={textStyles}&gt;{text}&lt;/Text&gt;
    &lt;/TouchableOpacity&gt;
  );
};

// set dimmenstion
const screen = Dimensions.get("window");
const buttonWidth = screen.width / 4;

const styles = StyleSheet.create({
  button: {
    backgroundColor: "#333333",
    flex: 1,
    height: Math.floor(buttonWidth - 10),
    alignItems: "center",
    justifyContent: "center",
    borderRadius: Math.floor(buttonWidth),
    margin: 5,
  },
  text: {
    color: "#fff",
    fontSize: 24,
  },
  textSecondary: {
    color: "#060606",
  },
  buttonDouble: {
    width: screen.width / 2 - 10,
    flex: 0,
    alignItems: "flex-start",
    paddingLeft: 40,
  },
  buttonSecondary: {
    backgroundColor: "#a6a6a6",
  },
  buttonAccent: {
    backgroundColor: "#ffc107",
  },
});
</code></pre><h2 id="paso-3-crear-el-componente-de-fila"><strong>Paso 3: Crear el componente de fila</strong></h2><p>El siguiente componente que crearemos es un componente Fila. Este componente es útil para crear filas cuando queremos procesar diseños.</p><p>Aquí está el código para el componente Fila y su código de estilo:</p><pre><code class="language-javascript">import { StyleSheet, View } from "react-native";

const Row = ({ children }) =&gt; {
  return &lt;View style={styles.container}&gt;{children}&lt;/View&gt;;
};

// create styles of Row
const styles = StyleSheet.create({
  container: {
    flexDirection: "row",
  },
});

export default Row;
</code></pre><p>Esto es lo que está pasando:</p><ul><li>En el componente de fila, hay 1 propiedad que necesitamos: Niños.</li><li>El componente de fila usa el componente de vista predeterminado de React Native.</li><li>flexDirection: "fila" en este estilo se usa para hacer que el diseño sea una fila.</li></ul><h2 id="paso-4-crear-la-l-gica-de-la-calculadora"><strong>Paso 4: Crear la lógica de la calculadora</strong></h2><p>Crea una nueva carpeta llamada útil y un nuevo archivo <strong><strong>calcula</strong>tor<strong>.js</strong></strong> . Aquí crearemos una función lógica en la aplicación de calculadora que implementaremos más adelante en el archivo <strong><strong>App.js. </strong></strong>Aquí está el código completo:</p><pre><code class="language-javascript">export const initialState = {
  currentValue: "0",
  operator: null,
  previousValue: null,
};

export const handleNumber = (value, state) =&gt; {
  if (state.currentValue === "0") {
    return { currentValue: `${value}` };
  }

  return {
    currentValue: `${state.currentValue}${value}`,
  };
};

const handleEqual = (state) =&gt; {
  const { currentValue, previousValue, operator } = state;

  const current = parseFloat(currentValue);
  const previous = parseFloat(previousValue);
  const resetState = { operator: null, previousValue: null };

  switch (operator) {
    case "+":
      return {
        currentValue: `${previous + current}`,
        ...resetState,
      };
    case "-":
      return {
        currentValue: `${previous - current}`,
        ...resetState,
      };
    case "*":
      return {
        currentValue: `${previous * current}`,
        ...resetState,
      };
    case "/":
      return {
        currentValue: `${previous / current}`,
        ...resetState,
      };

    default:
      return state;
  }
};

// calculator function
const calculator = (type, value, state) =&gt; {
  switch (type) {
    case "number":
      return handleNumber(value, state);
    case "clear":
      return initialState;
    case "posneg":
      return {
        currentValue: `${parseFloat(state.currentValue) * -1}`,
      };
    case "percentage":
      return {
        currentValue: `${parseFloat(state.currentValue) * 0.01}`,
      };
    case "operator":
      return {
        operator: value,
        previousValue: state.currentValue,
        currentValue: "0",
      };
    case "equal":
      return handleEqual(state);
    default:
      return state;
  }
};

export default calculator;
</code></pre><p>Y esto es lo que está pasando:</p><ul><li>initialState se usa para dar el valor predeterminado a nuestra aplicación de calculadora.</li><li>La función handleNumber sirve para devolver el valor de la calculadora y tiene 2 propiedades: valor y estado.</li><li>El identificador de función Equal sirve para procesar el valor establecido de cada operador matemático y devuelve su valor.</li><li>La calculadora de funciones válida cada operador dado. Por ejemplo, si el número llama a la función handleNumber, si está claro, devolverá el valor de estado predeterminado de initiaState, y así sucesivamente.</li></ul><h2 id="paso-5-refactorizar-el-archivo-app-js"><strong>Paso 5: Refactorizar el archivo App.js</strong></h2><p>Una vez que hemos creado todos los componentes y el proceso lógico, el siguiente paso es realizar ajustes en el código del archivo App.js. Aquí está el código completo:</p><pre><code class="language-javascript">import React, { Component } from "react";
import { SafeAreaView, StyleSheet, Text, View } from "react-native";
import Button from "./components/Button";
import Row from "./components/Row";
import calculator, { initialState } from "./util/calculator";

// create class component of App
export default class App extends Component {
  state = initialState;

  // handle tap method
  HandleTap = (type, value) =&gt; {
    this.setState((state) =&gt; calculator(type, value, state));
  };

  // render method
  render() {
    return (
      &lt;View style={styles.container}&gt;
        {/* Status bae here */}
        &lt;SafeAreaView&gt;
          &lt;Text style={styles.value}&gt;
            {parseFloat(this.state.currentValue).toLocaleString()}
          &lt;/Text&gt;

          {/* Do create componentRow */}
          &lt;Row&gt;
            &lt;Button
              text="C"
              theme="secondary"
              onPress={() =&gt; this.HandleTap("clear")}
            /&gt;

            &lt;Button
              text="+/-"
              theme="secondary"
              onPress={() =&gt; this.HandleTap("posneg")}
            /&gt;

            &lt;Button
              text="%"
              theme="secondary"
              onPress={() =&gt; this.HandleTap("percentage")}
            /&gt;

            &lt;Button
              text="/"
              theme="accent"
              onPress={() =&gt; this.HandleTap("operator", "/")}
            /&gt;
          &lt;/Row&gt;

          {/* Number */}
          &lt;Row&gt;
            &lt;Button text="7" onPress={() =&gt; this.HandleTap("number", 7)} /&gt;
            &lt;Button text="8" onPress={() =&gt; this.HandleTap("number", 8)} /&gt;
            &lt;Button text="9" onPress={() =&gt; this.HandleTap("number", 9)} /&gt;
            &lt;Button
              text="X"
              theme="accent"
              onPress={() =&gt; this.HandleTap("operator", "*")}
            /&gt;
          &lt;/Row&gt;

          &lt;Row&gt;
            &lt;Button text="5" onPress={() =&gt; this.HandleTap("number", 5)} /&gt;
            &lt;Button text="6" onPress={() =&gt; this.HandleTap("number", 6)} /&gt;
            &lt;Button text="7" onPress={() =&gt; this.HandleTap("number", 7)} /&gt;
            &lt;Button
              text="-"
              theme="accent"
              onPress={() =&gt; this.HandleTap("operator", "-")}
            /&gt;
          &lt;/Row&gt;

          &lt;Row&gt;
            &lt;Button text="1" onPress={() =&gt; this.HandleTap("number", 1)} /&gt;
            &lt;Button text="2" onPress={() =&gt; this.HandleTap("number", 2)} /&gt;
            &lt;Button text="3" onPress={() =&gt; this.HandleTap("number", 3)} /&gt;
            &lt;Button
              text="+"
              theme="accent"
              onPress={() =&gt; this.HandleTap("operator", "+")}
            /&gt;
          &lt;/Row&gt;

          &lt;Row&gt;
            &lt;Button text="0" onPress={() =&gt; this.HandleTap("number", 0)} /&gt;
            &lt;Button text="." onPress={() =&gt; this.HandleTap("number", ".")} /&gt;
            &lt;Button
              text="="
              theme="primary"
              onPress={() =&gt; this.HandleTap("equal", "=")}
            /&gt;
          &lt;/Row&gt;
        &lt;/SafeAreaView&gt;
      &lt;/View&gt;
    );
  }
}

// create styles of app
const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#202020",
    justifyContent: "flex-end",
  },
  value: {
    color: "#fff",
    fontSize: 42,
    textAlign: "right",
    marginRight: 20,
    marginBottom: 10,
  },
});
</code></pre><p>Algunas notas rápidas:</p><ul><li>handleTap es una función que creamos que tiene como objetivo proporcionar valores de estado y llamar a utils/calculator.</li><li>Aquí llamamos a dos componentes, Botón y Fila, para diseñar la apariencia de la calculadora, como sus números, operaciones matemáticas y el proceso de cálculo.</li></ul><h2 id="paso-6-ejecuta-la-aplicaci-n"><strong>Paso 6: Ejecuta la aplicación</strong></h2><p>En este paso intentaremos ejecutar la aplicación de calculadora en el dispositivo o podemos usar un emulador. Aquí uso el simulador de iPhone de MacOS. Ejecuta el siguiente comando para ejecutar el programa:</p><pre><code class="language-bash">$ yarn ios</code></pre><p>El proceso en ejecución aquí usa Expo como se muestra a continuación:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-350.png" class="kg-image" alt="image-350" width="600" height="400" loading="lazy"></figure><p>Si el proceso de compilación está completo, entonces la pantalla de la aplicación de calculadora que programamos será así:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/01/image-351.png" class="kg-image" alt="image-351" width="600" height="400" loading="lazy"></figure><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Eso es suficiente para este artículo. Aprendiste sobre estilo, componentes, propiedades y estados en React Native y creaste una aplicación de calculadora funcional.</p><p>Si necesitas el código fuente completo, puedes visitar mi repositorio de GitHub aquí: <a href="https://github.com/bangadam/calculator-app" rel="nofollow noopener noopener">https://github.com/bangadam/calculator-app</a></p><h3 id="-gracias-por-leer-"><strong>¡Gracias por leer!</strong></h3><p>¡Disponible para un nuevo proyecto! Hablemos.<br>Correo electrónico: <a href="mailto:bangadam.dev@gmail.com" rel="noopener ugc nofollow">bangadam.dev@gmail.com</a><br>Linkedin: <a href="https://www.linkedin.com/in/bangadam/" rel="noopener ugc nofollow noopener noopener">https://www.linkedin.com/in/bangadam</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
