我只是想用按钮创建一个应用程序,当按下按钮时,它会显示一个警告信息。
但是它给了我这个错误(下面提到)。
我参考这视频编写了这段代码。
我使用adb连接在android手机上运行这个应用程序。
请救救..!
代码
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;
}
);
}
}
这就是我写的代码。我还尝试将testAlert()函数的内容直接插入到onPressed中,但不起作用。
错误
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
发布于 2019-05-23 05:02:03
这是因为您要传递给showDialog
方法的上下文是一个在小部件树中还没有MaterialLocalizations
小部件的context
,MaterialLocalizations
小部件是由MaterialApp
小部件隐式添加的。
若要修复该问题,请尝试以下操作:
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;
});
}
}
发布于 2019-10-16 16:10:07
在我的例子中,一个简单的解决方法就是简单地将MaterialApp小部件移动到main()方法。
main() {
runApp(MaterialApp(home: App()));
}
发布于 2020-07-28 04:18:06
当您切换到不受GlobalMaterialLocalizations
委托支持的语言时,也会发生这种情况。这是一个很难理解的信息,因为它说你应该把MaterialApp
放在树的顶端,但它可能已经存在了。
在我的例子中,我正在本地化的语言(英国威尔士语- cy-GB
)不会自动满足需求。我必须为样板字符串编写自己的委托,并将其添加到应用程序根目录的本地化列表中。
白俄罗斯代表的代码是这里。我调整了它以迎合威尔士语。它包含日期格式信息,以及材料设计认为您可能需要的大约70个股票短语,如“选择所有”、“页面of”等。
如果您需要创建一个包含未在全局材料本地化中列出的语言的委托,那么一旦创建了委托,查看代码基,然后在树的顶部附近有一行如下
MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en', ''), // English, no country code
const Locale('he', ''), // Hebrew, no country code
const Locale.fromSubtags(languageCode: 'zh')
],
// ...
)
只需将CyMaterialLocalizations.delegate
(或您所称的新语言委托)添加到localizationsDelegates
列表中即可。
https://stackoverflow.com/questions/56275595
复制相似问题