More
Construyendo una aplicación Flutter de arrastrar y soltar con widgets arrastrables y Back4App
22 min
introducción las interfaces interactivas de arrastrar y soltar mejoran la experiencia del usuario al permitir que los usuarios manipulen los elementos de la interfaz de usuario de manera intuitiva flutter proporciona los draggable y dragtarget widgets para crear tales interacciones en este tutorial, aprenderás a construir una aplicación flutter que utiliza draggable widgets para mover elementos entre listas, con persistencia de datos utilizando back4app—un backend como servicio impulsado por parse server al final de este tutorial, tendrás una aplicación flutter funcional donde los usuarios pueden arrastrar elementos de una lista a otra, y los cambios se almacenarán y recuperarán de back4app este tutorial es adecuado para desarrolladores de flutter de todos los niveles de experiencia requisitos previos para completar este tutorial, necesitarás flutter sdk instalado en tu máquina sigue la guía de instalación oficial de flutter https //flutter dev/docs/get started/install para tu sistema operativo conocimientos básicos de flutter y dart si eres nuevo en flutter, revisa la documentación de flutter https //flutter dev/docs para familiarizarte con los conceptos básicos un ide o editor de texto como visual studio code o android studio una cuenta de back4app regístrate para obtener una cuenta gratuita en back4app https //www back4app com/ parse server sdk para flutter agregado a tu proyecto aprende cómo configurarlo siguiendo la guía de sdk de flutter de back4app https //www back4app com/docs/flutter/parse flutter sdk descripción general construiremos una aplicación de gestión de tareas donde las tareas se pueden arrastrar de una lista de "por hacer" a una lista de "completadas" y viceversa la aplicación usa draggable widgets para habilitar el arrastre de tareas usa dragtarget widgets para definir zonas de caída almacena y recupera tareas de back4app para persistir datos paso 1 – configuración del proyecto flutter 1 1 crea un nuevo proyecto flutter abre tu terminal y ejecuta flutter create drag drop app navega al directorio del proyecto cd drag drop app 1 2 agregar dependencias abre pubspec yaml y agrega las siguientes dependencias dependencies flutter sdk flutter parse server sdk flutter ^4 0 1 ejecuta flutter pub get para instalar los paquetes paso 2 – configurando back4app 2 1 crear una nueva aplicación en back4app inicia sesión en tu panel de back4app https //dashboard back4app com/ haz clic en "crear nueva app" ingresa un nombre para tu aplicación, por ejemplo, "dragdropapp" , y haz clic en "crear" 2 2 configurar el modelo de datos en el panel de control de tu aplicación, navega a la "base de datos" sección haz clic en "crear una clase" en el modal selecciona "personalizado" ingresa "tarea" como el nombre de la clase haz clic en "crear clase" 2 3 agregar columnas a la clase en la "tarea" clase, haz clic en "+" para agregar nuevas columnas agrega las siguientes columnas título tipo cadena estado tipo cadena agrega algunos datos de ejemplo a la "tarea" clase por ejemplo 2 4 obtener credenciales de la aplicación navega a configuración de la aplicación > seguridad y claves anota tu id de aplicación y clave de cliente paso 3 – inicializando parse en tu aplicación flutter abre lib/main dart y modifícalo de la siguiente manera import 'package\ flutter/material dart'; import 'package\ parse server sdk flutter/parse server sdk dart'; import 'screens/home page dart'; // you'll create this file next void main() async { widgetsflutterbinding ensureinitialized(); const keyapplicationid = 'your application id'; const keyclientkey = 'your client key'; const keyparseserverurl = 'https //parseapi back4app com'; await parse() initialize( keyapplicationid, keyparseserverurl, clientkey keyclientkey, debug true, ); runapp(myapp()); } class myapp extends statelesswidget { @override widget build(buildcontext context) { return materialapp( title 'drag and drop app', theme themedata( primaryswatch colors blue, ), home homepage(), ); } } reemplaza 'your application id' y 'your client key' con tus credenciales reales de back4app paso 4 – creando el modelo de tarea crea un nuevo directorio llamado models bajo lib y agrega un archivo llamado task dart // lib/models/task dart class task { string id; string title; string status; task({required this id, required this title, required this status}); } paso 5 – obteniendo tareas de back4app crea un nuevo directorio llamado services bajo lib y agrega un archivo llamado task service dart // lib/services/task service dart import 'package\ parse server sdk flutter/parse server sdk dart'; import ' /models/task dart'; class taskservice { future\<list\<task>> gettasksbystatus(string status) async { final querybuilder\<parseobject> query = querybuilder\<parseobject>(parseobject('task')) whereequalto('status', status); final parseresponse apiresponse = await query query(); if (apiresponse success && apiresponse results != null) { return apiresponse results! map((data) { return task( id data objectid!, title data get\<string>('title') ?? '', status data get\<string>('status') ?? '', ); }) tolist(); } else { return \[]; } } future\<void> updatetaskstatus(string id, string status) async { var task = parseobject('task') objectid = id set('status', status); await task save(); } } paso 6 – construyendo la interfaz de usuario con draggable y dragtarget crea un nuevo directorio llamado screens bajo lib y agrega un archivo llamado home page dart // lib/screens/home page dart import 'package\ flutter/material dart'; import ' /models/task dart'; import ' /services/task service dart'; class homepage extends statefulwidget { @override homepagestate createstate() => homepagestate(); } class homepagestate extends state\<homepage> { final taskservice taskservice = taskservice(); list\<task> todotasks = \[]; list\<task> completedtasks = \[]; @override void initstate() { super initstate(); fetchtasks(); } future\<void> fetchtasks() async { var todo = await taskservice gettasksbystatus('to do'); var completed = await taskservice gettasksbystatus('completed'); setstate(() { todotasks = todo; completedtasks = completed; }); } void ondragaccept(task task, string newstatus) async { await taskservice updatetaskstatus(task id, newstatus); await fetchtasks(); } @override widget build(buildcontext context) { return scaffold( appbar appbar( title text('drag and drop tasks'), ), body row( children \[ expanded( child taskcolumn( title 'to do', tasks todotasks, ondragaccept (task) => ondragaccept(task, 'to do'), ), ), expanded( child taskcolumn( title 'completed', tasks completedtasks, ondragaccept (task) => ondragaccept(task, 'completed'), ), ), ], ), ); } } class taskcolumn extends statelesswidget { final string title; final list\<task> tasks; final function(task) ondragaccept; taskcolumn({ required this title, required this tasks, required this ondragaccept, }); @override widget build(buildcontext context) { return dragtarget\<task>( onwillaccept (task) => true, onaccept (task) { ondragaccept(task); }, builder (context, candidatedata, rejecteddata) { return container( padding edgeinsets all(16 0), child column( children \[ text( title, style textstyle(fontsize 22, fontweight fontweight bold), ), expanded( child listview( children tasks map((task) { return draggable\<task>( data task, feedback material( child taskcard(task task), elevation 4 0, ), childwhendragging opacity( opacity 0 5, child taskcard(task task), ), child taskcard(task task), ); }) tolist(), ), ), ], ), ); }, ); } } class taskcard extends statelesswidget { final task task; taskcard({required this task}); @override widget build(buildcontext context) { return card( margin edgeinsets symmetric(vertical 8 0), child listtile( title text(task title), ), ); } } explicación página de inicio la pantalla principal que muestra dos columnas—"por hacer" y "tareas completadas" columna de tareas un widget que muestra tareas y actúa como un objetivo de arrastre para tareas arrastrables }]}]},{ tarjeta de tarea un widget para mostrar información de tareas individuales paso 7 – ejecutando la aplicación 7 1 ejecutar la aplicación en tu terminal, ejecuta flutter run 7 2 probar la funcionalidad de arrastrar y soltar arrastra una tarea de la columna "por hacer" y suéltala en la columna "completado" el estado de la tarea debería actualizarse y debería aparecer bajo "completado" el cambio persiste en back4app; si reinicias la aplicación, la tarea permanece en su nuevo estado conclusión en este tutorial, aprendiste cómo implementar la funcionalidad de arrastrar y soltar en una aplicación flutter utilizando draggable y dragtarget widgets integraste back4app para almacenar y recuperar datos de tareas, permitiendo la persistencia de datos a través de sesiones esta aplicación interactiva demuestra cómo mejorar la experiencia del usuario con elementos de interfaz intuitivos y un backend escalable conclusiones clave widgets arrastrables permitir a los usuarios arrastrar elementos de la interfaz widgets dragtarget definir zonas de caída para elementos arrastrables integración con back4app proporciona un backend para almacenar y gestionar datos próximos pasos agregar autenticación implementar autenticación de usuarios para tener listas de tareas personalizadas mejorar ui/ux agregar animaciones, íconos personalizados y diseños mejorados actualizaciones en tiempo real usar las consultas en vivo de back4app para actualizar tareas en tiempo real en múltiples dispositivos manejo de errores implementar manejo de errores para problemas de red y conflictos de datos recursos adicionales documentación de back4app https //www back4app com/docs guía del sdk de parse para flutter https //docs parseplatform org/flutter/guide/ documentación oficial de flutter https //flutter dev/docs widget arrastrable https //api flutter dev/flutter/widgets/draggable class html widget dragtarget https //api flutter dev/flutter/widgets/dragtarget class html ¡feliz codificación!