I was just trying to create an app with button which shows an alert message when the button is pressed.
But it gives me this error(Mentioned below).
I wrote this code by taking reference of this video.
I am running the application on a live android phone using adb connect
Please help..!
Code
import 'package:flutter/material.dart'; void main(){ runApp(MyApp()); } class MyApp extends StatelessWidget{ @override Widget build(BuildContext context) { return MaterialApp( title: "Test", home: Scaffold( appBar: AppBar(title: Text("Test")), body: Container( child: Center( child: RaisedButton( color: Colors.redAccent, textColor: Colors.white, onPressed: (){testAlert(context);}, child: Text("PressMe"), ), ), ), ), ); } void testAlert(BuildContext context){ var alert = AlertDialog( title: Text("Test"), content: Text("Done..!"), ); showDialog( context: context, builder: (BuildContext context){ return alert; } ); } }
This is the code that i wrote. I also tried inserting the contents of testAlert() function directly into onPressed but doesn't work.
Error
Performing hot reload... Syncing files to device ZUK Z2131... Reloaded 0 of 419 libraries in 1,929ms. I/flutter (18652): ══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════ I/flutter (18652): The following assertion was thrown while handling a gesture: I/flutter (18652): No MaterialLocalizations found. I/flutter (18652): MyApp widgets require MaterialLocalizations to be provided by a Localizations widget ancestor. I/flutter (18652): Localizations are used to generate many different messages, labels,and abbreviations which are used I/flutter (18652): by the material library. I/flutter (18652): To introduce a MaterialLocalizations, either use a MaterialApp at the root of your application to I/flutter (18652): include them automatically, or add a Localization widget with a MaterialLocalizations delegate. I/flutter (18652): The specific widget that could not find a MaterialLocalizations ancestor was: I/flutter (18652): MyApp I/flutter (18652): The ancestors of this widget were: I/flutter (18652): [root] I/flutter (18652): I/flutter (18652): When the exception was thrown, this was the stack: I/flutter (18652): #0 debugCheckHasMaterialLocalizations.<anonymous closure> (package:flutter/src/material/debug.dart:124:7) I/flutter (18652): #1 debugCheckHasMaterialLocalizations (package:flutter/src/material/debug.dart:127:4) I/flutter (18652): #2 showDialog (package:flutter/src/material/dialog.dart:635:10) I/flutter (18652): #3 MyApp.testAlert (package:flutter_app/main.dart:33:5) I/flutter (18652): #4 MyApp.build.<anonymous closure> (package:flutter_app/main.dart:19:29) I/flutter (18652): #5 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14) I/flutter (18652): #6 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30) I/flutter (18652): #7 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24) I/flutter (18652): #8 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9) I/flutter (18652): #9 TapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:175:7) I/flutter (18652): #10 PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:315:9) I/flutter (18652): #11 PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:73:12) I/flutter (18652): #12 PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:101:11) I/flutter (18652): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:180:19) I/flutter (18652): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22) I/flutter (18652): #15 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7) I/flutter (18652): #16 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7) I/flutter (18652): #17 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7) I/flutter (18652): #18 _invoke1 (dart:ui/hooks.dart:168:13) I/flutter (18652): #19 _dispatchPointerDataPacket (dart:ui/hooks.dart:122:5) I/flutter (18652): I/flutter (18652): Handler: onTap I/flutter (18652): Recognizer: I/flutter (18652): TapGestureRecognizer#d5d82(debugOwner: GestureDetector, state: possible, won arena, finalPosition: I/flutter (18652): Offset(220.2, 406.1), sent tap down) I/flutter (18652): ════════════════════════════════════════════════════════════════════════════════════════════════════ W/ActivityThread(18652): handleWindowVisibility: no activity for token android.os.BinderProxy@59b4e8d I/ViewRootImpl(18652): CPU Rendering VSync enable = true
This is because the context you are passing into the showDialog
method is a context
that doesn't yet have a MaterialLocalizations
widget in the widget tree, the MaterialLocalizations
widget gets added implicitly by the MaterialApp
widget.
To fix it, try the following:
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: "Test", home: TestPage(), ); } } class TestPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text("Test")), body: Container( child: Center( child: RaisedButton( color: Colors.redAccent, textColor: Colors.white, onPressed: () { testAlert(context); }, child: Text("PressMe"), ), ), ), ); } void testAlert(BuildContext context) { var alert = AlertDialog( title: Text("Test"), content: Text("Done..!"), ); showDialog( context: context, builder: (BuildContext context) { return alert; }); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With