No ScaffoldMessenger widget found
When using the ScaffoldMessenger
widget in Flutter, you may encounter the puzzling "No ScaffoldMessenger widget found" error. In this post, we will explore this common error message and go over different solutions to resolve it. The aim is to help you overcome the issue and gain a better understanding of how to use this widget.
1. Understanding the error
The "No ScaffoldMessenger widget found" error occurs when the ScaffoldMessenger.of(context)
function is unable to find the nearest ancestor ScaffoldMessenger
widget in the widget tree. The ScaffoldMessenger
is used to show SnackBars
and other similar messages within the application.

2. Identifying the error
Let us take a look at a sample code snippet that produces the "No ScaffoldMessenger widget found" error:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: ElevatedButton(
child: const Text('Show Snackbar'),
onPressed: () => ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'The ScaffoldMessenger widget has been found.',
textAlign: TextAlign.center,
),
),
),
),
),
),
);
}
}
In this code, we have a simple Flutter application with a single ElevatedButton
. When the button is pressed, it should display a SnackBar
with the message "The ScaffoldMessenger widget has been found." However, running this code results in the "No ScaffoldMessenger widget found" error.
The error occurs because the ScaffoldMessenger.of(context)
method is unable to find the required ScaffoldMessenger
widget. But wait, doesn't the MaterialApp
automatically provide a default ScaffoldMessenger
widget? Yes, it does.
The issue lies in the context we are passing to the ScaffoldMessenger
. The context
we are using is provided by the build
method of our MyApp
widget, which cannot access the ScaffoldMessenger
because there is no ScaffoldMessenger
above it.
3. Resolving the error
To fix the error, we need to ensure that the correct context is used to access the ScaffoldMessenger
. Here is an updated version of the code with the necessary changes:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Builder(
builder: (context) => Center(
child: ElevatedButton(
child: const Text('Show Snackbar'),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'The ScaffoldMessenger widget has been found.',
textAlign: TextAlign.center,
),
),
);
},
),
),
),
),
);
}
}
In this updated code, we wrap the Center
widget with a Builder
widget. The Builder
widget creates a new context within its builder
function, ensuring that the correct context containing the ScaffoldMessenger
is used.
This simple modification allows us to run the code without encountering the "No ScaffoldMessenger widget found" error. Pressing the "Show Snackbar" button will now display the desired SnackBar
with the message.

4. An Alternative Solution
Even though the provided solution works, we can achieve a better code structure. Here is an alternative solution:
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MyPage(),
);
}
}
class MyPage extends StatelessWidget {
const MyPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: ElevatedButton(
child: const Text('Show Snackbar'),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'The ScaffoldMessenger widget has been found.',
textAlign: TextAlign.center,
),
),
);
},
),
),
);
}
}
In the alternative solution, we create a separate widget called MyPage
to hold all the content of our application. This helps us organize our code better and separate different parts of our application into their own dedicated widgets. Think of the MyPage
widget as the main page of our application.
This solution makes use of the context of the MaterialApp
widget, meaning that we do not need an additional widget like the Builder
to get the right context. By directly using the context passed to the MyPage
widget, we can access the ScaffoldMessenger
and show the SnackBar
without any errors.
With this alternative solution, we achieve a cleaner code structure while still resolving the error and displaying the SnackBar
correctly.
5. Conclusion
The "No ScaffoldMessenger widget found" error can be resolved by ensuring the correct context is used to access the ScaffoldMessenger
. By following the provided solution or adopting the alternative solution for a better code structure, you can overcome this error and display SnackBar
messages without any issues.