Skip to content

Semplificazione passaggio di funzioni #3

@ncvescera

Description

@ncvescera

Per come è scritto il codie per poter invocare una funzione di un Widget da un altro widget gli va passata come parametro.

void setStateNoFile() {
setState(() {
_filePath = "";
_body = NoFilePage(
appName: appName,
notifyParent: fileLoaded,
deleteFile: deleteFile,
updateCallback: _checkUpdateOnStart,
);
});
}

Questa riga mostra questo esempio: la funzione _checkUpdateOnStart viene passata al Widget che poi la usa al suo interno in qualche punto
updateCallback: _checkUpdateOnStart,

Questo, fin quando si tratta di passare una funzione ad un widget va bene, ma inizia a sorgere un problema di comprensione del codice quando quella funzione deve essere passata ad un Widget che la passa ad un Widget che la passa ad un Widget ecc.

Ho trovato un modo per semplificare il tutto che permette di invocare una funzione direttamente dal Widget che ne ha bisogno senza dover ricorrere a questo passaggio. Lo svantaggio è che va esposto lo stato del Widget che contiene la funzione in questione e serve quindi una gestione degli attributi e degli altri metodi migliroe (le variabili/metodi che devono essere privati vanno messi privati per bene).

Il metodo funziona così:

Espongo lo stato del widget dove è contenuta la funzione che voglio che venga utilizzata da altri widget.

class HomePage extends StatefulWidget {
  const HomePage({
    Key? key,
    required this.appName,
  }) : super(key: key);

  final String appName;
 
  // esposizione dello stato del widget
  static of(BuildContext context, {bool root = false}) => root
      ? context.findRootAncestorStateOfType<_HomePageState>()
      : context.findAncestorStateOfType<_HomePageState>();
  // ------------- //
  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  void myFunction() {
     print('FUNZIONO');
  }

  ...

Utilizzo quindi la funzione che voglio all'interno di un altro widget.

... 

class _MyAppBarState extends State<MyAppBar> {

  void aFunction() {
     HomePage.of(context).myFunction();
  }
 
  ...

TODO:

  • Testare questo metodo e vedere se migliora effettivamente la lettura del codice e non peggiora le performance
    • Implementarlo !

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions