Flutter Templates
Cómo construir una aplicación de inmersión en idiomas AR con Flutter y Back4App
41 min
introducción en este tutorial, construirás una aplicación de inmersión lingüística en realidad aumentada (ar) utilizando flutter y back4app la aplicación aprovecha la tecnología ar para reconocer objetos a través de la cámara del dispositivo, superponer traducciones, proporcionar información cultural y rastrear el progreso del usuario al final de este tutorial, tendrás una aplicación funcional que ayuda a los usuarios a aprender nuevos idiomas en contextos del mundo real requisitos previos para completar este tutorial, necesitarás flutter instalado en tu máquina local si aún no lo has configurado, sigue la guía de instalación de flutter https //flutter dev/docs/get started/install una cuenta de back4app regístrate para obtener una cuenta gratuita en back4app https //www back4app com/ una aplicación de back4app crea una nueva aplicación siguiendo la guía de introducción a back4app https //www back4app com/docs/get started conocimientos básicos de dart y flutter familiarízate con la documentación de flutter https //flutter dev/docs si es necesario comprensión básica de apis restful y programación asíncrona en dart paso 1 – configuración del proyecto flutter primero, configura un nuevo proyecto flutter donde desarrollarás la aplicación de inmersión lingüística en ar 1 1 crear un nuevo proyecto flutter abre tu terminal y ejecuta el siguiente comando flutter create ar language immersion app este comando crea un nuevo proyecto de flutter llamado ar language immersion app 1 2 abre el proyecto en tu ide navega al directorio del proyecto y ábrelo en tu ide preferido (por ejemplo, visual studio code, android studio) cd ar language immersion app paso 2 – configurando el backend de back4app configura tu backend en back4app para manejar datos de usuarios, traducciones, información cultural y seguimiento del progreso del usuario 2 1 crear una nueva aplicación en back4app inicia sesión en tu cuenta de back4app haz clic en "crear nueva app" ingresa "aplicación de inmersión en lenguaje ar" como el nombre de la aplicación haz clic en "crear" 2 2 configuración del modelo de datos define las clases según el modelo de datos usuario objetoreconocible traducción informacióncultural progresodelusuario 2 2 1 crear la clase de usuario la clase de usuario es una clase predeterminada en back4app para manejar la autenticación de usuarios navega a núcleo > navegador en tu panel de control de back4app verás la usuario clase ya disponible 2 2 2 crear la clase recognizableobject haz clic en "crear una clase" elige "personalizado" y nómbralo "recognizableobject" haz clic en "crear clase" agrega las siguientes columnas nombre (string) categoría (string) referenciadeimagen (archivo) 2 2 3 crear la clase translation crea otra clase llamada "translation" agrega las siguientes columnas objectid (string) \[predeterminado] objectid (puntero a recognizableobject) languagecode (string) textotraducido (string) guíadepronunciación (string) referenciadearchivodeaudio (archivo) 2 2 4 crear la clase culturalinfo crea una clase llamada "culturalinfo" agrega las siguientes columnas objectid (puntero a recognizableobject) languagecode (cadena) shortdescription (cadena) detailedinformation (cadena) relatedmediareferences (array de archivos) 2 2 5 crea la clase userprogress crea una clase llamada "userprogress" agrega las siguientes columnas userid (puntero al usuario) recognizedobjects (array de ids de objetos reconocibles) translationsviewed (array de ids de traducción) culturalinfoaccessed (array de ids de información cultural) learningstreaks (número) proficiencyscores (diccionario) 2 3 recuperar claves de aplicación ir a configuración de la aplicación > seguridad y claves anota tu id de aplicación y clave de cliente ; las necesitarás para inicializar parse en tu aplicación flutter paso 3 – integrando parse sdk en flutter integra el sdk de parse proporcionado por back4app en tu proyecto de flutter para comunicarte con el backend 3 1 agregar dependencias abre pubspec yaml y agrega las siguientes dependencias dependencies flutter sdk flutter parse server sdk flutter ^4 0 1 camera ^0 10 0 flutter spinkit ^5 1 0 augmented reality plugin ^0 0 1 # hypothetical ar plugin ejecuta el comando flutter pub get 3 2 inicializa parse en tu aplicación en lib/main dart , inicializa parse durante el inicio de la aplicación import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; void main() async { widgetsflutterbinding ensureinitialized(); const string applicationid = 'your application id'; const string clientkey = 'your client key'; const string parseserverurl = 'https //parseapi back4app com'; await parse() initialize( applicationid, parseserverurl, clientkey clientkey, autosendsessionid true, debug true, ); runapp(myapp()); } reemplaza 'your application id' y 'your client key' con las claves que obtuviste de back4app paso 4 – implementación de la autenticación de usuarios implementar funcionalidades de registro e inicio de sesión de usuario 4 1 crear pantalla de autenticación crea un nuevo archivo lib/screens/auth screen dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class authscreen extends statefulwidget { @override authscreenstate createstate() => authscreenstate(); } class authscreenstate extends state\<authscreen> { bool islogin = true; final usernamecontroller = texteditingcontroller(); final passwordcontroller = texteditingcontroller(); future\<void> submit() async { if (islogin) { final user = parseuser( usernamecontroller text trim(), passwordcontroller text trim(), null, ); var response = await user login(); if (response success) { // navigate to main app navigator of(context) pushreplacementnamed('/home'); } else { // show error showerror(response error message); } } else { final user = parseuser( usernamecontroller text trim(), passwordcontroller text trim(), usernamecontroller text trim() + '@example com', // placeholder email ); var response = await user signup(); if (response success) { // navigate to main app navigator of(context) pushreplacementnamed('/home'); } else { // show error showerror(response error message); } } } void showerror(string message) { showdialog( context context, builder (ctx) => alertdialog( title text('an error occurred!'), content text(message), actions \[ textbutton( child text('okay'), onpressed () => navigator of(ctx) pop(), ), ], ), ); } @override widget build(buildcontext context) { return scaffold( appbar appbar( title text(islogin ? 'login' 'sign up'), ), body padding( padding edgeinsets all(16 0), child column( children \[ textfield( controller usernamecontroller, decoration inputdecoration(labeltext 'username'), ), textfield( controller passwordcontroller, decoration inputdecoration(labeltext 'password'), obscuretext true, ), sizedbox(height 20), elevatedbutton( child text(islogin ? 'login' 'sign up'), onpressed submit, ), textbutton( child text(islogin ? 'don\\'t have an account? sign up' 'already have an account? login'), onpressed () { setstate(() { islogin = !islogin; }); }, ), ], ), )); } } 4 2 actualizar main dart para incluir rutas en lib/main dart , actualiza tu materialapp para incluir rutas import 'screens/auth screen dart'; import 'screens/home screen dart'; class myapp extends statelesswidget { @override widget build(buildcontext context) { return materialapp( title 'ar language immersion', theme themedata( primaryswatch colors blue, ), home authscreen(), routes { '/home' (ctx) => homescreen(), }, ); } } paso 5 – implementación del reconocimiento de objetos ar configura la funcionalidad ar para reconocer objetos utilizando la cámara del dispositivo 5 1 configurar permisos para android e ios, necesitas solicitar permisos de cámara android en android/app/src/main/androidmanifest xml , añade \<uses permission android\ name="android permission camera" /> ios en ios/runner/info plist , añade \<key>nscamerausagedescription\</key> \<string>we need to access your camera to recognize objects for language learning \</string> 5 2 implementar vista ar crea un nuevo archivo lib/screens/ar view screen dart import 'package\ flutter/material dart'; // import your ar plugin here class arviewscreen extends statefulwidget { @override arviewscreenstate createstate() => arviewscreenstate(); } class arviewscreenstate extends state\<arviewscreen> { @override widget build(buildcontext context) { // placeholder for ar view return scaffold( appbar appbar( title text('ar language immersion'), ), body center( child text('ar view coming soon'), ), ); } } 5 3 simular el reconocimiento de objetos para fines de demostración, simularemos el reconocimiento de objetos mostrando objetos predefinidos actualizar ar view screen dart import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; class arviewscreen extends statefulwidget { @override arviewscreenstate createstate() => arviewscreenstate(); } class arviewscreenstate extends state\<arviewscreen> { list\<string> recognizedobjects = \['apple', 'book', 'chair']; string selectedobject; @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('ar language immersion'), ), body column( children \[ expanded( child center( child text( selectedobject != null ? 'recognized object $selectedobject' 'point your camera at an object', style textstyle(fontsize 20), ), ), ), container( height 150, child listview\ builder( scrolldirection axis horizontal, itemcount recognizedobjects length, itembuilder (ctx, index) { return gesturedetector( ontap () { setstate(() { selectedobject = recognizedobjects\[index]; }); }, child card( child container( width 100, alignment alignment center, child text(recognizedobjects\[index]), ), ), ); }, ), ), ], ), ); } } paso 6 – mostrando superposiciones de traducción obtén traducciones de back4app y muéstralas como superposiciones 6 1 obtener datos de traducción en ar view screen dart , agrega un método para obtener traducciones future\<string> gettranslation(string objectname) async { querybuilder\<parseobject> query = querybuilder\<parseobject>(parseobject('translation')) whereequalto('objectname', objectname) whereequalto('languagecode', 'es'); // example target language var response = await query query(); if (response success && response results != null) { final translation = response results first; return translation get\<string>('translatedtext'); } else { return 'translation not found'; } } 6 2 actualizar la interfaz de usuario para mostrar la traducción modifica el build método expanded( child center( child selectedobject != null ? futurebuilder\<string>( future gettranslation(selectedobject), builder (ctx, snapshot) { if (snapshot connectionstate == connectionstate waiting) { return circularprogressindicator(); } else if (snapshot haserror) { return text('error fetching translation'); } else { return text( snapshot data, style textstyle(fontsize 24, fontweight fontweight bold), ); } }, ) text( 'point your camera at an object', style textstyle(fontsize 20), ), ), ), paso 7 – proporcionar información cultural obtén y muestra información cultural relacionada con el objeto reconocido 7 1 obtener información cultural agrega un método en ar view screen dart future\<string> getculturalinfo(string objectname) async { querybuilder\<parseobject> query = querybuilder\<parseobject>(parseobject('culturalinfo')) whereequalto('objectname', objectname) whereequalto('languagecode', 'es'); // example target language var response = await query query(); if (response success && response results != null) { final info = response results first; return info get\<string>('shortdescription'); } else { return 'no cultural info available'; } } 7 2 actualizar la interfaz de usuario para mostrar información cultural modifica el build método return column( mainaxisalignment mainaxisalignment center, children \[ text( snapshot data, style textstyle(fontsize 24, fontweight fontweight bold), ), sizedbox(height 10), futurebuilder\<string>( future getculturalinfo(selectedobject), builder (ctx, infosnapshot) { if (infosnapshot connectionstate == connectionstate waiting) { return circularprogressindicator(); } else if (infosnapshot haserror) { return text('error fetching cultural info'); } else { return text( infosnapshot data, style textstyle(fontsize 16), ); } }, ), ], ); paso 8 – seguimiento del progreso del usuario actualiza el progreso del usuario cada vez que vea una traducción o información cultural 8 1 actualizar userprogress en back4app agrega un método para actualizar el progreso future\<void> updateuserprogress(string objectname) async { final currentuser = await parseuser currentuser() as parseuser; // fetch userprogress querybuilder\<parseobject> query = querybuilder\<parseobject>(parseobject('userprogress')) whereequalto('userid', currentuser objectid); var response = await query query(); parseobject userprogress; if (response success && response results != null) { userprogress = response results first; } else { // create new userprogress userprogress = parseobject('userprogress') set('userid', currentuser); } // update recognizedobjects list\<dynamic> recognizedobjects = userprogress get\<list\<dynamic>>('recognizedobjects') ?? \[]; if (!recognizedobjects contains(objectname)) { recognizedobjects add(objectname); userprogress set('recognizedobjects', recognizedobjects); await userprogress save(); } } 8 2 llamar a updateuserprogress cuando se reconozca un objeto en setstate donde selectedobject se actualiza ontap () { setstate(() { selectedobject = recognizedobjects\[index]; }); updateuserprogress(selectedobject); }, paso 9 – implementando el modo offline asegúrate de que la aplicación pueda funcionar sin conexión a internet para las funciones principales 9 1 almacenar datos localmente usa una base de datos local como sqflite o hive para almacenar traducciones e información cultural agrega la hive dependencia en pubspec yaml dependencies hive ^2 0 0 hive flutter ^1 1 0 inicializa hive en main dart import 'package\ hive flutter/hive flutter dart'; void main() async { widgetsflutterbinding ensureinitialized(); await hive initflutter(); // initialize parse } 9 2 modificar métodos de obtención de datos para usar caché actualiza el método gettranslation future\<string> gettranslation(string objectname) async { var box = await hive openbox('translations'); string cachekey = '$objectname es'; // example target language if (box containskey(cachekey)) { return box get(cachekey); } else { // fetch from back4app querybuilder\<parseobject> query = querybuilder\<parseobject>(parseobject('translation')) whereequalto('objectname', objectname) whereequalto('languagecode', 'es'); var response = await query query(); if (response success && response results != null) { final translation = response results first; string translatedtext = translation get\<string>('translatedtext'); await box put(cachekey, translatedtext); return translatedtext; } else { return 'translation not found'; } } } repita pasos similares para getculturalinfo paso 10 – pruebas y despliegue pruebe la aplicación a fondo y prepárela para el despliegue 10 1 probar en dispositivos físicos dado que las funcionalidades de ar requieren acceso a la cámara, pruebe la aplicación en dispositivos reales 10 2 optimizar el rendimiento utilice estructuras de datos eficientes minimice las re renderizaciones innecesarias en la interfaz de usuario optimice las imágenes y los activos multimedia 10 3 prepararse para el despliegue actualizar los íconos de la aplicación y las pantallas de inicio configurar los permisos de la aplicación construir versiones de lanzamiento para android e ios consulte la documentación oficial de flutter sobre construcción y lanzamiento https //flutter dev/docs/deployment para más detalles conclusión ¡felicidades! has construido una aplicación de inmersión lingüística en ar utilizando flutter y back4app la aplicación reconoce objetos, muestra traducciones e información cultural, rastrea el progreso del usuario y funciona sin conexión puedes mejorar aún más la aplicación integrando el reconocimiento de objetos ar real, añadiendo más idiomas y mejorando la ui/ux para más información sobre características avanzadas, considera explorar integración de modelos de aprendizaje automático utiliza tensorflow lite para el reconocimiento de objetos en el dispositivo mejorando las capacidades de ar utiliza complementos como arcore flutter plugin o arkit plugin para experiencias de ar más ricas implementación de texto a voz agrega síntesis de voz para guías de pronunciación utilizando paquetes como flutter tts mejorando la autenticación de usuarios implementa inicios de sesión sociales o autenticación de dos factores al construir esta aplicación, has ganado experiencia en el desarrollo de flutter, integración de backend con back4app y características esenciales como almacenamiento en caché de datos sin conexión y seguimiento del progreso del usuario sigue explorando y mejorando tu aplicación para crear una experiencia de aprendizaje de idiomas aún más atractiva