
L’atto di lanciare una moneta per prendere una decisione è uno dei rituali più antichi e universali dell’umanità. Spesso lo riduciamo a un banale gioco di fortuna, ma affonda le sue radici nella cleromanzia: la pratica di interpellare il destino o la volontà divina attraverso l’estrazione a sorte.
Questo articolo documenta il processo di design e sviluppo di un’applicazione mobile e desktop realizzata in Flutter, nata con l’obiettivo di elevare il classico “Testa o Croce” a un’esperienza interattiva, con aspirazione colta e fortemente personalizzabile.
1. La Visione del Progetto: Oltre la Casualità
L’applicazione non si limita a generare un risultato binario (Sì/No), ma cala l’utente all’interno di un vero e proprio “rituale digitale”. Ogni lancio è influenzato dalla cultura selezionata, combinando rigore matematico e fedeltà storica.
Le Culture Implementate
🌒* Antica Grecia (NYX / HEMERA): Ispirato al dualismo primordiale tra Notte e Giorno: Nyx, la Madre Oscura, e Hemera, la Figlia della Luce. Il responso nasce dal loro eterno avvicendarsi: un sì che sorge come l’aurora, un no che cala come il velo della notte. 🏛️* Antica Roma (Alea / Navia aut Capita): Ispirato al gioco romano in cui si scommetteva sulla faccia della moneta che raffigurava la nave o la testa del dio Giano Bifronte. ᚠ* Cultura Vichinga (Il Lancio delle Rune): Un approccio legato ai simboli e alla volontà degli dèi norreni. (modalità non ancora implementata) 👁️* Cultura Egizia (L’Occhio di Horus): Il dualismo tra protezione e caos attraverso i simboli sacri. (modalità non ancora implementata) ☯️* Filosofia Cinese (I Ching / Tre Monete): Un sistema unico in cui le risposte non nascono da un semplice bivio, ma derivano dal calcolo delle cariche Yang (linee intere) e Yin (linee spezzate) generate dal lancio simultaneo di tre monete rituali. 🎲* L’Astragalomanzia greco-romana-anatolica: Pratica antichissima basata sul lancio degli astragali — ossicini con quattro facce stabili — ciascuna associata a divinità, presagi e profili simbolici. Un dialogo con il fato attraverso numeri, cadute e combinazioni che gli antichi consideravano un linguaggio degli dèi. ⚜️* La Francia del Alto Medioevo (Pile ou face): Una delle forme più semplici e popolari di cleromanzia medievale: il lancio di una moneta per interrogare la sorte. Un gesto rapido, quotidiano, che trasformava il caso in giudice supremo delle piccole e grandi decisioni 🍃* Le Isole Britanniche (Ogham celtico): Il sistema divinatorio dei druidi, basato sui segni dell’Ogham incisi sul legno sacro. Ogni tratto rappresenta un albero, una forza della natura, un responso che parla con la voce antica delle foreste. 🎭* Gli archetipi rinascimentali (I tarocchi): Un viaggio simbolico attraverso figure archetipiche — il Matto, la Papessa, la Morte, il Sole — che riflettono le tensioni, le paure e le aspirazioni dell’animo umano. Non predicono: rivelano. Sono specchi rinascimentali che trasformano il caso in narrazione.
2. Architettura del Codice e Struttura Dati
Per garantire la massima scalabilità (con la possibilità di aggiungere decine di nuove culture in futuro), l’architettura è stata fondata su una separazione netta tra logica e dati, sfruttando i paradigmi della programmazione a oggetti (OOP).
Cultura(Il Modello): Una classe astratta (o blueprint) che definisce le proprietà immutabili di ogni rituale: identificativi, stringhe dinamiche per i bottoni, e metodi dedicati a restituire i testi storici e i responsi localizzati.CultureDatabase(Il Repository): Un archivio centralizzato che contiene le istanze statiche delle culture, gestendo i codici colore specifici per ogni stato (il colore identitario della cultura, il colore del trionfo/Sì e il colore del rifiuto/No).Widget dedicati per ogni pratica divinatoria: Ogni rituale — che si tratti del lancio di una moneta, del tiro degli astragali, del sorteggio di rune o della generazione di linee Yin/Yang — è stato tradotto in un widget Flutter autonomo, con logica interna isolata e un’interfaccia coerente con il motore principale. Questi widget fungono da “interpreti” tra il gesto rituale e l’engine dell’app: trasformano l’azione (tap, swipe, shake, estrazione) in un esito cleromantico che viene poi consegnato al modello Cultura per la generazione del responso finale.
3. Il Fondamento Criptografico nel calcolo del Caso: Random.secure()
In un’applicazione legata al destino, il generatore di numeri casuali non poteva essere un algoritmo lineare prevedibile. È stato scartato il classico operatore pseudo-casuale in favore di Random.secure(), integrato nativamente in Flutter.
Questo approccio attinge direttamente alle primitive crittografiche del sistema operativo sottostante, garantendo che ogni oscillazione della moneta o calcolo delle cariche Yin/Yang sia matematicamente imprevedibile, sicuro e immune a pattern ripetitivi.
In un’applicazione che si confronta con il destino, il caso non può essere un’illusione matematica.
Per questo è stato escluso ogni generatore pseudo-casuale lineare, in favore di Random.secure(), l’unico RNG nativo di Dart/Flutter che si appoggia direttamente alle primitive crittografiche del sistema operativo.
A differenza dei generatori pseudo-casuali tradizionali — che producono sequenze deterministiche basate su un seme iniziale — Random.secure():
attinge all’entropia reale del dispositivo, come rumore termico, jitter dei clock, microvariazioni hardware;
non è riproducibile, nemmeno conoscendo lo stato interno dell’app;
non genera pattern ciclici, perché non usa formule lineari o moltiplicatori modulari;
è progettato per la sicurezza, lo stesso livello richiesto per chiavi crittografiche, token di sessione, firme digitali.
In altre parole: ogni lancio è un evento unico, non simulabile, non prevedibile, non replicabile.
4. Internazionalizzazione (i18n) e Localizzazione (l10n)
L’applicazione è stata concepita fin dal primo giorno per parlare a un pubblico globale. Utilizzando lo strumento ufficiale di Flutter (flutter gen-l10n), l’interfaccia adatta istantaneamente ogni singola stringa, inclusi i sofisticati testi dei dialoghi storici e i tooltip.
L’infrastruttura si basa su file di risorse in formato JSON (app_it.arb e app_en.arb). Un dettaglio tecnico di rilievo è la gestione dei segnaposto dinamici (come {yang} o {yin}), che permettono di iniettare i risultati del calcolo matematico all’interno delle stringhe tradotte senza rompere la sintassi o la fluidità della lettura.
5. UI/UX: Un’Estetica Sacra e Minimale
L’interfaccia utente rifiuta gli elementi moderni e caotici, abbracciando un minimalismo geometrico che richiama i testi antichi:
- Palette Colori: Uno sfondo “sabbia/pergamena” (
0xFFF5F2EB) per il tema chiaro, pensato per non affaticare la vista e dare calore all’esperienza. - Interazione: Un grande elemento circolare centrale che racchiude il responso, protetto da un’ombra morbida a più livelli per dare profondità tridimensionale, circondato da un bordo dinamico che muta colore in base al verdetto del fato.
- Accessibilità: Ogni icona interattiva è dotata di tooltip localizzati (es. “Opzioni”, “Fattore Caso”), garantendo un’esperienza d’uso fluida anche con i sistemi di lettura dello schermo.
6. Gestione del Tema e Reattività: Il Dualismo Luce/Ombra
Invece di appesantire l’albero dei widget o ricorrere a complessi state manager esterni, il cambio del tema (Sistema, Chiaro, Scuro) è stato affidato a un ValueNotifier<ThemeMode> globale.
final ValueNotifier<ThemeMode> notificatoreTema = ValueNotifier(ThemeMode.system);
Attraverso un ValueListenableBuilder inserito alla radice dell’applicazione in main.dart, l’intera interfaccia intercetta il cambio di stato e si ridisegna istantaneamente, modificando lo sfondo del canvas (che passa al grigio profondo esoterico 0xFF1E1E24 in modalità scura) e ricalcolando i contrasti dei testi.
L’accesso a questa sezione è stato associato a un’icona fortemente simbolica nell’AppBar: Icons.brightness_6, un cerchio diviso perfettamente a metà tra luce e ombra, che incarna la natura stessa della scelta binaria.
7. Filosofia di Sviluppo e Sfide Tecniche
Durante lo sviluppo della schermata delle impostazioni, il progetto si è scontrato con le ultime evoluzioni sperimentali del framework Flutter (build pre-release v3.32). Il team di Flutter sta introducendo una ristrutturazione dei selettori d’opzione (passando al paradigma del RadioGroup).
Per preservare la stabilità assoluta dell’applicazione senza rinunciare alla pulizia dei log di compilazione, è stata adottata una strategia di retrocompatibilità resiliente, isolando i componenti classici e istruendo l’analizzatore statico tramite direttive mirate (// ignore: deprecated_member_use). Questo ha permesso di mantenere il codice snello, privo di warning e pronto per i futuri canali stabili.
Inoltre, nella sezione About, è stata integrata la gestione sicura dei link esterni tramite il plugin url_launcher, permettendo agli utenti di approfondire la conoscenza del progetto e dello sviluppatore navigando direttamente verso il sito di riferimento mensiva.it.
Prossimi Passi
Con una base architetturale solida, l’applicazione è pronta per accogliere:
- Nuove culture e sistemi divinatori complessi (es. le rune nordiche).
- Effetti di micro-animazione per la rotazione delle monete e la comparsa delle linee dell’I Ching.
- Ottimizzazioni specifiche per i profili di risparmio energetico sui dispositivi mobile.