Programmare applicazioni mobili con flutter

Pubblicità
Forse ho avuto la genialata:
JavaScript:
print('numero: ' +
        FontAwesome.newspaper_o.codePoint.toString() +
        '\nfont nome: ' +
        FontAwesome.newspaper_o.fontFamily +
        '\n font pacchetto:' +
        FontAwesome.newspaper_o.fontPackage);
Risultato:
Codice:
I/flutter ( 3663): numero: 61930
I/flutter ( 3663): font nome: FontAwesome
I/flutter ( 3663): font pacchetto: flutter_icons
E poi provando con:
JavaScript:
IconData(61930, fontFamily: 'FontAwesome', fontPackage: 'flutter_icons')
Funziona! :luxhello:

Devo ringraziarti soprattutto per il fatto che ogni singola cosa me la fai capire bene, invece di darmi codice da "imparare a memoria". :brindiamo:

Ora mi manca solo una cosa: il controllo.
Il codice attuale è questo:
JavaScript:
factory VoceTipizzata.dajson(Map<String, dynamic> json) =>
      VoceTipizzata(
        numero: json['vid'] as int,
        nome: json['nome'] as String,
        icona: Icon(
          IconData(
          json['icona-numint'] as int,
          fontFamily: json['icona-fontnome'] as String,
          fontPackage: json['icona-fontpac'] as String
          ),
          size: 36.0,
          color: Color(json['coloreicona'] as int),
        ),
      );
Si trova nella definizione di VoceTipizzata.

Vorrei controllare se i 3 parametri danno un'icona valida o no, nel caso ci metto io una predefinita. Può anche capitare che in alcune voci prelevate dal db, non ci siano icone, quindi devo dare null.

Come posso fare?

Grazie
 
Vorrei controllare se i 3 parametri danno un'icona valida o no, nel caso ci metto io una predefinita. Può anche capitare che in alcune voci prelevate dal db, non ci siano icone, quindi devo dare null.

Se non c'è l'icona, non devi fare niente. Nel campo del database relativo ci dev'essere un valore vuoto o null. Dipende dal database e da come l'hai impostato.

Per l'altra cosa, non so come si comporta IconData quando gli vengono passati dati invalidi. Se segue le convenzioni del framework, dovrebbe restituire un errore.

L'altra possibilità è creare un oggetto della classe FontAwesomeIcons e usare questo https://api.flutter.dev/flutter/dart-core/Map/containsKey.html

per verificare se ha un attributo col nome dell'icona specificata.
 
C'è un modo per non far restituire errore da parte del framework e magari mi dà false o null nel caso non è icona valida?
Così nel caso ci metto un mio widget predefinito.

Grazie
 
C'è un modo per non far restituire errore da parte del framework e magari mi dà false o null nel caso non è icona valida?
Così nel caso ci metto un mio widget predefinito.

Grazie

E perchè mai? Dart implementa le eccezioni, che sono fatte apposta per restituire gli errori, catturarli ed elaborarli.
 
Puoi farmi un esempio? Magari come avresti fatto tu in una situazione del genere.

Mettiamo caso i 3 campi (icona_numint, icona_fontnome, icona_fontpacchetto) siano null o non danno un'icona valida, cosa avresti fatto per non far capire niente all'utente che visita la mia app?


Grazie
 
Ho letto la documentazione che mi hai allegato.

Ho capito che va "provato" del codice a rischio errore, nel caso mio la costruzione dell'oggetto IconData. Nel caso ci sono problemi, si lanciano eccezioni, che possono essere catturate e/o rilanciate.

L'unico modo di provocare un errore è quello di inserire dati sbagliati nella tabella del db. L'ho fatto, ma non riesco a "sbagliare". Nella tabella ho messo questi valori:
JSON:
{
            "nome": "Farmacie",
            "icona_numint": 57669,
            "icona_fontnome": "MaterialIcons",
            "icona_fontpacc": null,
            "icona_colore": 4281103636
        },
        {
            "nome": "Liberi professionisti",
            "icona_numint": 1000,
            "icona_fontnome": "Sbaglia",
            "icona_fontpacc": "pacc_sbaglia",
            "icona_colore": 4278917497
        },
Il codice dart di tipizzazione è questo:
JavaScript:
factory VoceTipizzata.dajson(Map<String, dynamic> json) {
    Widget _icona;
    try {
      _icona = Icon(
        IconData(json['icona_numint'] as int,
            fontFamily: json['icona_fontnome'] as String,
            fontPackage: json['icona_fontpacc'] as String),
        size: 40.0,
        color: Color(json['icona_colore'] as int),
      );
    } catch (e) {
      _icona = CircleAvatar();
    }
    return VoceTipizzata(
      nome: json['nome'] as String,
      icona: _icona,
    );
  }
Risultato:
Schermata da 2020-07-23 18-19-28.webp

Qualsiasi valore metto, non dà errore e non mi mostra l'oggetto CircleAvatar().

Dove ho sbagliato?

Grazie
 
Eh ma io lì vedo due icone, il che vuol dire che quei numeri che gli passi sono identificativi di icone esistenti. Perchè dovrebbe darti errore?
 
Sto provando in tutti i modi di farmi dare errore, ma non ci riesco.

Comunque scrivendo "Sbaglia" come nome del font, non è già un errore?

Grazie
 
Sto provando in tutti i modi di farmi dare errore, ma non ci riesco.

Comunque scrivendo "Sbaglia" come nome del font, non è già un errore?

Grazie

Magari esiste un font chiamato Sbaglia :D

Poi dovresti verificare pure cosa ritorna il costruttore, oltre ad eventuali eccezioni. E' possibile che non generi l'oggetto IconData o che ne crei uno con un'icona/font di default.
 
Ho fatto qualche tentativo, e nella console mi sono fatto mostrare l'oggetto IconData:
Codice:
IconData(U+02710)
IconData(U+04E20)
IconData(U+08EC5)
IconData(U+00001)
Ovviamente con il font "Sbaglia", ma con numeri interi diversi. Qualche volta sono stati visualizzati caratteri cinesi, ma l'errore non lo riesco a provocare.

Ci tengo a precisare che all'oggetto MaterialApp ho dato il font predefinito "Ubuntu" per qualsiasi cosa. Può essere quello?

Grazie
 
Eh si. Le proprietà sono ereditate, se mancanti o sbagliate. Per cui si, sta usando il font Ubuntu per risolvere i codepoint Unicode.

Al che, non ti resta altro da fare che fare una lista dei codepoint corrispondenti alle icone dei font che userai e usare quella per verificare.
 
Per ora ho tamponato lasciando try catch e mettendo una lista di codepoint ammessi, nel caso sbagliato do io un widget predefinito.

Ora sto elaborando un campo del db un po' complesso: immagini.
Il campo immagini l'ho fatto in formato json, così in sql:
SQL:
`immagini` json default null,
Ho pensato di farlo così in quanto ogni singola voce nella tabella può avere una o più immagini allegate, come può anche non avere niente, in questo caso va il null. Non voglio usare un'altra tabella con chiave esterna, perché chiederò solo l'elenco della tabella in oggetto.
Nella tipizzazione dei dati provenienti dal db, mi ritrovo un json contenente un altro json all'interno come stringa del campo immagini:
JavaScript:
factory VoceTipizzata.dajson(Map<String, dynamic> j) => VoceTipizzata(
        verificato: (j['verificato'] as int) > 0 as bool,
        nome: j['nome'] as String,
        // altri campi
        immagini: json.decode(j['immagini']),
      );
Il fatto è che il json dev'essere solo in questo formato
JSON:
[
    "immagine1.png",
    "immagine2.png",
    "immagine3.png"
]
Quindi dev'essere solo un'array non associativa contenente stringhe. Il parametro immagini dell'oggetto VoceTipizzata l'ho dichiarato come Set<String>.

Ora mi serve controllare se il campo immagini proveniente dal db sia nel formato che voglio io, altrimenti restituire null.

Come posso fare?

Grazie
 
quello sotto non è json

un array in json si mostra così

JSON:
{
   "eBooks":[
      {
         "language":"Pascal",
         "edition":"third"
      },
      {
         "language":"Python",
         "edition":"four"
      },
      {
         "language":"SQL",
         "edition":"second"
      }
   ]
}

se non ti serve json, perchè vuoi usarlo per forza?
 
Per elencare le immagini allegate in un unico campo mysql, dal php elaboro così:
PHP:
$immagini = array(
'immagine1.png',
'immagine2.png',
'immagine3.png',
);
Che mi produce un json come quello scritto al post #118.
Quindi ora mi serve controllare quel json in uscita.

Se hai un modo migliore per memorizzare un elenco di voci in un singolo campo mysql (senza altre tabelle), è meglio.

Grazie
 
Pubblicità
Pubblicità
Indietro
Top