未找到材质本地化 - MyApp 小部件要求由本地化小部件祖先提供材质本地化

  • 本文关键字:本地化 小部 祖先 MyApp android dart flutter
  • 更新时间 :
  • 英文 :


我只是想创建一个带有按钮的应用程序,当按下按钮时会显示一条警报消息。

但它给了我这个错误(下面提到)。

我通过参考此视频编写了此代码。

我正在使用adb connect在实时安卓手机上运行该应用程序

请帮忙..!

法典

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

这是因为您传递给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;
});
}
}

在我的情况下,一个简单的解决方法就是将 MaterialApp 小部件移动到 main() 方法。

main() {
runApp(MaterialApp(home: App()));
}

当您切换到GlobalMaterialLocalizations委托不支持的语言时,也会发生这种情况。这是一个很难理解的消息,因为它说你应该在树的顶部有MaterialApp,但这可能已经存在。

就我而言,我本地化的语言(英国威尔士语 -cy-GB)不会自动满足。我必须为样板字符串编写自己的委托,并将其添加到应用根目录的本地化列表中。

白俄罗斯代表的代码在这里。我对其进行了调整以迎合威尔士语。它包含日期格式信息,以及材料设计认为您可能需要的大约七十个常用短语,例如"全选","页面"等。

如果您需要创建一个涵盖全局材料本地化中未列出的语言的委托,那么一旦您创建了委托,查看您的代码库,在树顶部附近的某个地方,您将有一行类似

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列表中即可。

我对RaisedButton内部的showTimePicker有同样的问题,

我重组为:

runApp 
|__MaterialApp
|__ StatefulWidget/StatelessWidget
|__SafeArea
|__Scaffold
|__ RaisedButton
|__ showTimePicker

以下是示例工作解决方案:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
void main() {
runApp(
MaterialApp(
debugShowCheckedModeBanner: false,
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), 
],
home: Sample(),
),
);
}
class Sample extends StatefulWidget {
@override
_SampleState createState() => _SampleState();
}
class _SampleState extends State<Sample> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
body: Center(
child: RaisedButton(
child: Text('Time Picker'),
onPressed: () {
showTimePicker(
context: context,
initialTime: TimeOfDay(hour: 10, minute: 47),
builder: (BuildContext context, Widget child) {
return MediaQuery(
data: MediaQuery.of(context)
.copyWith(alwaysUse24HourFormat: true),
child: child,
);
},
);
},
),
),
),
);
}
}

localizationsDelegatessupportedLocales添加到MaterialApp为我解决了问题

localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
Locale('en', 'US'),
],

另一种方法是用Builder包装调用showDialog的最内部小部件。在这种情况下,最内部的小部件是TextButton(请注意,我用TextButton替换了已弃用的RaisedButton)。

import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text("Test")),
body: Container(
child: Builder(
builder: (context) {
return TextButton(
child: const Text('Show'),
onPressed: () {
showDialog(
context: context,
builder: (_) => AlertDialog(
title: Text("Test"),
content: Text("Done..!"),
),
);
},
);
},
),
),
),
);
}
}

我遇到了同样的问题,我需要在其中显示 dailog

initState();

我像这样解决,

Future.delayed(Duration.zero, () {
showGameOverDailog(context);
});

就我而言,当我在 StatefulWidget 中插入此记录时,它发生了:

const MyApp({Key? key}) : super(key: key);
localizationsDelegates: [
MonthYearPickerLocalizations.delegate,
],

我正在使用MonthYearPicker软件包,我必须将其添加到我的MaterialApp小部件中

我遇到了这个问题 2 天,2 天后小技巧对我有用。

我只是保留supportedLocales: const [Locale('en', 'IN')]并删除其他人。

另一种方法是删除supportedLocales: const [Locale('en', 'IN')]也对我有用。

构建方法应返回MaterialApp 而不是 Scaffold。在您的材料应用程序的家中,您可以拥有脚手架

Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(),   //or your Page with Scaffold
);
}

解决此问题的最简单方法是将页面重命名为主页 在此处输入图像描述

然后返回 Home 类中的基架小部件

在此处输入图像描述

最新更新