Ho il sospetto che questo potrebbe non essere possibile, dare un'occhiata a questo codice:
int test1(int a, int b, int c) {
return a;
}
int test2(final int a, final int b, final int c) {
return a;
}
const Function f1 = test1;
const Function f2 = (final a,b,c) => a;
const Map<String, Function> MAP_OF_FUNCS = const {
'foo': test1,
'fam': test2,
'bam': f1,
'bar': f2
};
Solo le prime due versioni che fanno riferimento al metodo statico fa riferimento test1
e test2
lavoro in questa costellazione. Anche f1
produce un errore di compilazione, UPDATE ma compila usando dartJS come @irn dai commenti evidenziati. Quindi non è chiaro il motivo per cui la versione con f2
non funziona.
Probabilmente è l'operatore di assegnazione che non è in grado di produrre un riferimento compilato staticamente per una determinata espressione lambda costante o un riferimento al metodo statico per l'argomento RHS (lato destro).
The documentation mi ha indicato per testare la combinazione static const
, ma generalmente funziona solo su elementi di livello non superiore come i membri della classe. Quindi aggiungere una nuova classe rende possibile testarlo.
class A {
static const Function a1 = test1;
static const Function a2 = (final a, final b, final c) => a;
}
const Map<String, Function> MAP_OF_FUNCS = const {
'foo': A.a1,
'bar': A.a2
};
Tuttavia, queste definizioni di funzione sono validi, ma l'assegnazione alla mappa fallisce come prima. La documentazione sulle mappe nella sezione built in types mostra come creare una mappa di costante di tempo di compilazione utilizzando la parola chiave final
.
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
Sfortunatamente, questo approccio ha lo stesso inconveniente. Potrebbe coraziarsi con i limiti di limitazione dei simboli:
Un oggetto simbolo rappresenta un operatore o un identificatore dichiarato in un programma Dart. Potrebbe non essere necessario utilizzare simboli, ma sono inestimabili per le API che fanno riferimento agli identificatori per nome, poiché la minificazione modifica i nomi degli identificatori ma non i simboli identificativi. ... I valori letterali dei simboli sono costanti in fase di compilazione.
Per ulteriori informazioni sui simboli, vedere dart:mirrors - reflection.
Forse qualcun altro ha un'idea migliore, ma per me questo non sembra possibile per il momento.
Grande scoperta, ho inserito i commenti di callback nei problemi in modo che le risposte corrette potrebbero essere spinte in futuro dagli autori. Altrimenti continua a tirare le informazioni;) –