Scaffold — is een centrale widget-frame in Flutter die de basis Material Design-schermstructuur implementeert met AppBar, Drawer, BottomNavigationBar en FloatingActionButton. Het plaatst niet alleen elementen, maar biedt een kant-en-klare architectuur met de juiste z-volgorde en verwerking van gebruikersgebaren. Volgens Flutter Documentation (2026) is Scaffold een verplicht root-element voor de correcte werking van Material-componenten, inclusief SnackBar en BottomSheet. In tegenstelling tot Container of Column beheert Scaffold automatisch SafeArea, adaptieve achtergrond en toetsenbordgedrag, wat het de standaard maakt voor het bouwen van schermen in mobiele applicaties.
Belangrijkste
Scaffold — een widget-compositor uit de Material Design-bibliotheek die de basis visuele schermstructuur vormt. Het implementeert het standaard Material-app-patroon: bovenpaneel, schermbody, zijmenu en zwevende knoppen. In tegenstelling tot Container, die alleen afmetingen en stijl instelt, beheert Scaffold het hele scherm als een uniform systeem.
Elke Flutter-app gebouwd volgens Material Design begint met MaterialApp, waarbinnen elk scherm in een Scaffold wordt verpakt. Juist Scaffold zorgt voor correcte weergave van AppBar op alle apparaten, rekening houdend met SafeArea voor iPhone X en hoger. Het is ook verantwoordelijk voor de z-volgorde: Drawer wordt boven body weergegeven en SnackBar boven de hele interface, maar onder dialoogvensters.
Volgens de officiële Flutter API Reference (2026) is Scaffold een verplichte voorwaarde voor de correcte werking van widgets zoals SnackBar, BottomSheet en PersistentBottomSheet. Zonder Scaffold gooien deze componenten een uitzondering omdat ze afhankelijk zijn van InheritedWidget Scaffold.of voor toegang tot de Scaffold-context. Daarom is het plaatsen van inhoud direct in Container in plaats van Scaffold een veelgemaakte fout van beginnende ontwikkelaars, wat leidt tot verlies van Material-functionaliteit.
In een typische Flutter-app bevindt Scaffold zich binnen MaterialApp, meestal onder WidgetsApp of CupertinoApp bij cross-platform ontwikkeling. MaterialApp creëert Navigator en thema, en Scaffold bepaalt de structuur van het huidige scherm. Elk scherm kan zijn eigen Scaffold hebben met unieke AppBar, Drawer en BottomNavigationBar, wat flexibele aanpassing van de interface voor een specifieke pagina mogelijk maakt.
Voor diepgaande aanpassing kan Scaffold worden gecombineerd met NestedScrollView — dit maakt complexe scrolleffecten mogelijk, zoals een verdwijnende AppBar met parallax-effect. In de meeste gevallen is standaard Scaffold met zijn eigenschappen echter voldoende voor het bouwen van een productie-klaar scherm.
Scaffold bestaat uit meerdere verplichte en optionele zones, elk verantwoordelijk voor een specifiek deel van de interface. Laten we elk onderdeel afzonderlijk bekijken om te begrijpen hoe ze met elkaar samenwerken.
AppBar — het bovenpaneel van het scherm dat de titel, navigatieknop en acties weergeeft. Het krijgt automatisch de juiste hoogte van 56dp en houdt rekening met SafeArea voor apparaten met een notch. In AppBar kan een TabBar worden ingebouwd voor het schakelen tussen tabbladen met behulp van de eigenschap bottom.
Drawer — een paneel dat van links komt en navigatie door de secties van de app biedt. Scaffold voegt automatisch het hamburgerpictogram toe aan AppBar als de eigenschap drawer is ingesteld. Drawer kan DrawerHeader, ListView met menu-items en gebruikersinformatie bevatten.
BottomNavigationBar — het paneel onderaan het scherm voor het schakelen tussen hoofdsecties. Het bevat 2 tot 5 pictogrammen met labels en ondersteunt Material 3 met actieve indicatie via NavigationBar. Scaffold plaatst het onderaan het scherm en verschuift body automatisch omhoog zodat inhoud niet wordt bedekt.
FloatingActionButton — een ronde knop geplaatst in de rechterbenedenhoek van het scherm. Het wordt gebruikt voor de hoofdactie op het scherm, zoals het toevoegen van een nieuw item of het verzenden van een bericht. Scaffold ondersteunt meerdere FABs met uitgebreide animatie via extended-eigenschappen.
Body — het centrale gebied van het scherm waar de hoofdinhoud wordt geplaatst. Als body kan elke widget dienen: Column, ListView, GridView, Stack of een aangepaste compositie. Scaffold berekent automatisch de hoogte van body rekening houdend met AppBar, BottomNavigationBar en SafeArea, wat handmatige aanpassing van afmetingen overbodig maakt.
Scaffold biedt meer dan 30 eigenschappen voor het configureren van het uiterlijk en gedrag van het scherm. Hieronder vallen zowel verplichte (body) als optionele eigenschappen die marges, achtergrond en toetsenbordstatus beheren. Inzicht in elke eigenschap helpt om de interface precies af te stemmen op ontwerpeisen.
| Eigenschap | Type | Beschrijving |
|---|---|---|
| appBar | PreferredSizeWidget? | Bovenpaneel van het scherm met titel en acties |
| body | Widget? | Hoofdinhoud van het scherm tussen AppBar en BottomNavigationBar |
| drawer | Widget? | Zijpaneel dat opent door naar links te vegen |
| bottomNavigationBar | Widget? | Onderste navigatiepaneel (BottomNavigationBar of NavigationBar) |
| floatingActionButton | Widget? | Zwevende knop voor de hoofdactie |
| backgroundColor | Color? | Achtergrondkleur van Scaffold, die het thema overschrijft |
| resizeToAvoidBottomInset | bool | Automatisch samendrukken van body bij verschijnen toetsenbord |
De eigenschap resizeToAvoidBottomInset is vooral belangrijk bij het werken met formulieren: wanneer ingesteld op true (standaard), drukt Scaffold body automatisch samen bij het verschijnen van het toetsenbord zodat het invoerveld zichtbaar blijft. Dit elimineert de noodzaak om aangepaste toetsenbordluisteraars te schrijven. Voor aangepaste scenarioën met SingleChildScrollView kan de eigenschap worden uitgeschakeld.
Laten we een praktisch voorbeeld bekijken van Scaffold met een volledige set Material-componenten. De code creëert een scherm met AppBar, Drawer, BottomNavigationBar, FloatingActionButton en SnackBar — de typische structuur van een mobiele app in Flutter.
class MainScreen extends StatefulWidget {
const MainScreen({super.key});
@override
State<MainScreen> createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
int selectedIndex = 0;
final List<Widget> pages = [
const HomePage(),
const SearchPage(),
const ProfilePage(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Mijn App'),
actions: [
IconButton(icon: const Icon(Icons.search), onPressed: () {}),
],
),
body: pages[selectedIndex],
drawer: Drawer(
child: ListView(
children: [
const DrawerHeader(child: Text('Menu')),
ListTile(title: const Text('Instellingen'), onTap: () {}),
],
),
),
bottomNavigationBar: NavigationBar(
selectedIndex: selectedIndex,
onDestinationSelected: (int index) {
setState(() => selectedIndex = index);
},
destinations: const [
NavigationDestination(icon: Icon(Icons.home), label: 'Home'),
NavigationDestination(icon: Icon(Icons.search), label: 'Search'),
NavigationDestination(icon: Icon(Icons.person), label: 'Profile'),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Actie voltooid')),
);
},
child: const Icon(Icons.add),
),
);
}
}
In het voorbeeld wordt NavigationBar uit Material 3 gebruikt in plaats van de verouderde BottomNavigationBar. Scaffold verbindt automatisch alle onderdelen: bij het openen van Drawer wordt SnackBar verborgen, bij het schakelen van tabbladen wordt body bijgewerkt en FloatingActionButton blijft op zijn plaats. ScaffoldMessenger garandeert weergave van SnackBar, zelfs bij meerdere Scaffolds in de hiërarchie.
Material 3 (M3) — is de evolutie van Material Design, gepresenteerd door Google in 2023. Scaffold in M3 kreeg een aantal wijzigingen: de nieuwe NavigationBar-widget in plaats van BottomNavigationBar, ondersteuning voor Dynamic Color via ColorScheme.fromSeed en bijgewerkte aanbevelingen voor marges en hoogtes van componenten. Overstappen naar M3 vereist geen vervanging van Scaffold — het volstaat om het thema van de app bij te werken.
Om Material 3 in het project in te schakelen, moet u useMaterial3: true instellen in ThemeData. Scaffold past het visuele uiterlijk automatisch aan: marges worden groter (24dp in plaats van 16dp), kleuren worden herberekend uit de seed-kleur en FloatingActionButton krijgt grotere afmetingen met afgeronde hoeken. Tegelijkertijd blijven alle bestaande eigenschappen van Scaffold functioneel.
Volgens Material Design 3 Specification (2026) wordt aanbevolen om NavigationBar met drie tot vijf items te gebruiken in plaats van BottomNavigationBar. Scaffold ondersteunt beide varianten, maar NavigationBar biedt betere ondersteuning voor aanpassingsvermogen en Material You op Pixel-apparaten.
Voor correcte werking van Scaffold met M3 volstaat het om het thema bij te werken en BottomNavigationBar te vervangen door NavigationBar. Kleuren worden automatisch berekend via ColorScheme.fromSeed en Scaffold past de marges aan de nieuwe standaarden aan. Indien nodig kunt u backgroundColor direct overschrijven.
Veelgestelde vragen
Scaffold — is een widget-frame van het hele scherm met ondersteuning voor Material-componenten (AppBar, Drawer, SnackBar), terwijl Container een basiscontainer is voor één onderliggend element zonder beheer van schermstructuur. Scaffold biedt z-volgorde, SafeArea en automatische gebaarverwerking, terwijl Container alleen afmetingen en stijl instelt.
Technisch ja, maar in de praktijk wordt het afgeraden. Als u één Scaffold in een andere plaatst, maakt de innerlijke Scaffold zijn eigen AppBar en BottomNavigationBar, wat leidt tot duplicatie van panelen en verwarring in de z-volgorde. Gebruik voor complexe lay-outs NestedScrollView of Column binnen de body van één Scaffold.
SnackBar is een onderliggende component van Scaffold en vereist zijn aanwezigheid in de widgetboom voor correcte weergave. Scaffold biedt ScaffoldState waarmee SnackBar het verschijnen animeert en zich onderaan het scherm positioneert. Zonder Scaffold gooit SnackBar een uitzondering omdat het ScaffoldState niet kan vinden in de context via InheritedWidget.
De achtergrondkleur van Scaffold wordt ingesteld via de eigenschap backgroundColor, die de themakleur voor een specifiek scherm overschrijft. Als u de achtergrond globaal wilt wijzigen, stelt u scaffoldBackgroundColor in ThemeData in. Material 3 berekent de achtergrondkleur automatisch uit ColorScheme.surface, maar kan handmatig worden overschreven.
ScaffoldMessenger — een hulpprogramma geïntroduceerd in Flutter 2.5 waarmee SnackBar en BottomSheet kunnen worden weergegeven onafhankelijk van de huidige Scaffold in de hiërarchie. In tegenstelling tot de verouderde Scaffold.of(context) werkt ScaffoldMessenger correct bij navigatie tussen schermen en verliest het geen context bij animaties. Het wordt aanbevolen om altijd ScaffoldMessenger te gebruiken voor feedback.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook