Dauðr Blog

Impostare uno sfondo comune nella tua App scritta in Flutter

September 12, 2020

Negli ultimi mesi ho iniziato a sviluppare delle app in Flutter e devo dire che per il momento mi sto trovando davvero bene con questa libreria che Google ha costruito e ci ha messo a disposizione. Ma per alcune cose ho avuto non pochi problemi, per esempio come settare un’immagine di sfondo comune a più pagine di una applicazione.
Continua a leggere questo articolo per capire come l’ho sviluppato nelle mie ultime applicazioni.

Foto di Efe Kurnaz su Unsplash

Capire Flutter: Widgets

Flutter è fatto di Widget, questi sono esattamente come dei mattoncini Lego, ne metti uno sopra all’altro per costruire la UI della tua App.
Il punto di inizio di tutte le App sviluppate in Flutter è il MaterialApp, questo Widget serve a far capire al compilatore dove inizia tutta la parte scritta in Flutter e a quali pagine puoi navigare se usi il Navigator con i parametri named, scelta molto consigliata.

Scaffold widget al salvataggio

Un altro widget che si trova in tutte le App scritte in Flutter è lo Scaffold, lo Scaffold ti permette di gestire tutta la visualizzazione dei tuoi widget sullo schermo, implementa nativamente la gestione di AppBar, BottomNavigationBar e Drawers. Solo questo è davvero utilissimo.
Quindi, continuando, tutti gli Scaffold hanno un campo obbligatorio: body, questo campo richiede un Widget generico, può essere qualsiasi Wdiget tu voglia, e se non specifichi altrimenti verrà posizionato nella parte più in alto a sinistra, appena sotto all’AppBar se ne esiste una o all’inizio dello schermo altrimenti.

Ecco un esempio:

import 'package:flutter/material.dart';

class MyScaffold extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: Container(
          child: Text('Hi world!'),
        ));
  }
}

Questo snippet non fa altro che mostrare un widget Text sotto all’AppBar. Ecco uno screenshot di esempio:

Detto questo, è ora di passare all’argomento principale di questo articolo, come possiamo usare le nuove informazioni in nostro possesso per impostare un’immagine di sfondo che verrà condivisa da tutta l’applicazione?
La risposta, a dire la verità, è abbastanza semplice, tutto quello che dobbiamo fare è usare un altro Widget: Stack.

Un altro Widget: Stack

Lo Stack ci permette di mettere un widget sopra ad un altro.
Ci sono diversi modi di renderizzare i nostri Widget in flutter, la maggior parte dei Widget (come Scaffold), ci permettono di avere un solo Widget come figlio, ma esistono altri tre Widet che ci consentono di avere più figli per un solo Widget, questi sono: Row, Column e Stack, però la spiegazioni di questi ultimi Widget non è argomento di questo articolo, quindi vi invito a leggere la documentazione di Flutter per capire come funzionano, sono davvero semplici.

Come possiamo usare lo Stack per il nostro scopo

Quello che possiamo fare ora è usare lo Scaffold per visualizzare un body che contiene uno Stack di default, lo Stack a sua volta avrà due figli: un Image per visualizza la nostra immagine di sfondo e un Container che prende tutto lo schermo per visulizzare tutto il resto.
Adesso che vedrai il codice capirai tutto:

import 'package:flutter/material.dart';

class MyScaffold extends StatelessWidget {
  final Widget child;
  final String image;

  ModelToysScaffold(
      { this.child,
      this.image = 'assets/images/background.png',});

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(), =>
      body: Stack(
        children: [
          Positioned(
            top: 0,
            child: Image.asset(
              image,
              height: MediaQuery.of(context).size.height,
              width: MediaQuery.of(context).size.width,
              fit: BoxFit.cover,
            ),
          ),
          Container(
            width: MediaQuery.of(context).size.width,
            height: MediaQuery.of(context).size.height,
            child: child,
          ),
        ],
      ),
    );
  }
}

Questo è il risultato:

Cosa ne pensi di questo approccio al problema?
Fammelo sapere nei commenti! 😉


Do you want to be updated when new articles are being published?

Join the newsletter! 😎

Written by Michele Da Rin Fioretto a freelance web developer that works in Italy and in the world.
His main area of expertise are Angular, React, Firebase & Serverless Architectures
You can also find him on