Generar Listado de Widgets Aleatorios en Flutter
Índice de contenido
Te voy a mostrar cómo puedes generar un listado aleatorio de elementos, ya sean enteros, números flotantes, strings u objetos, como en mi caso.
- Es realmente muy sencillo. El esquema que estoy siguiendo es el siguiente:
- Fíjate en la parte de construcción de la lista.
- La parte importante es que, en este ejemplo, los datos provienen de una API, aunque obviamente podrías tener un listado estático o generado de otra forma.
- Finalmente, al momento de construir el listado, le agregué un parámetro adicional para manejar la ordenación aleatoria.
class QuestionModel {
int id;
String title;
String tagTitle;
String tagDescription;
String type;
int tagId;
int questionsQuantity;
String language;
int randomOrder = 0;
List<QuestionSimpleModel> questionsSimple = [];
QuestionModel.fromJson(Map<String, dynamic> qMap)
: id = qMap['id'],
title = qMap['title'],
tagTitle = qMap['tag_title'],
tagDescription = qMap['tag_description'],
tagId = qMap['tag_id'],
type = qMap['type'],
questionsQuantity = qMap['questions_quantity'] ?? 0,
randomOrder = Random().nextInt(100), // orden aleatorio
language = qMap['language'];
}Este método sirve para indicar el orden de un listado. Sin embargo, puede ser un poco ineficiente dependiendo del tamaño de los datos. Por ejemplo:
- Si tenemos un listado de 1000 elementos, estamos creando 1000 instancias de Random, lo cual es ineficiente.
- Una alternativa más eficiente sería crear una sola instancia de Random y pasarla como parámetro al método que genera los números aleatorios.
Actualmente, para mi caso, trabajo con 15 preguntas por vez, por lo que esta ineficiencia no afecta mucho, pero es algo a tener en cuenta.
Cómo implementar el orden aleatorio
- Listado de objetos: primero defines la data que quieres manejar. En mi caso, es la que se muestra en pantalla.
- Parámetro de orden aleatorio: adicionalmente, se puede crear un parámetro que indique que los elementos deben ordenarse aleatoriamente.
- Puedes modificar esto libremente según tus necesidades.
- Otra opción es crear una clase base que contenga este parámetro y reciba el modelo como un tipo genérico (dynamic o template).
Ejemplo de clase wrapper
Si no quieres “ensuciar” la definición de tu clase con un parámetro de orden que no tiene relación con la clase principal, puedes crear una clase wrapper:
class Order<T> {
final T model;
final bool randomOrder;
Order({required this.model, this.randomOrder = false});
}De esta manera, mantienes la lógica de orden aleatorio separada del modelo principal y puedes reutilizarla en cualquier contexto.
Generación del listado aleatorio
El orden aleatorio no se aplica directamente en la definición de la clase, sino al momento de construir el listado.
- Aquí puedes manejar cualquier tipo de data: objetos locales o resultados de una API.
- Mediante un método llamado sort (o similar), construyes el listado final ya ordenado.
- Esta es la parte donde realmente se aplica la aleatoriedad.
_questions = await QuestionHelper.getQuestionGetByPrincipalId(
widget.id, userPreference.locale);
// orden aleatorio
_questions.sort((a, b) => a.randomOrder.compareTo(b.randomOrder));Lo que hacemos es ordenar los elementos en base a algún parámetro. En este caso, utilizamos un número generado de manera aleatoria. Es así de simple y, por lo demás, no hay más nada que configurar.
Acepto recibir anuncios de interes sobre este Blog.
Te comento sobre como puedes generar un listado con posiciones aleatorias de Widgets en Flutter.