tl;dr:如果您想从根窗口小部件调用showDialog,请将您的代码压缩到另一个窗口小部件(例如StatelessWidget),然后在那里调用showDialog。
无论如何,在下面我将假设您遇到了这个问题:
flutter: No MaterialLocalizations found.
flutter: MyApp widgets require MaterialLocalizations to be provided by a Localizations widget ancestor.
flutter: Localizations are used to generate many different messages, labels,and abbreviations which are used by the material library.
如前所述,showDialog 只能在 BuildContext 中调用,其祖先有 MaterialApp。因此,如果您有这样的结构,您不能直接调用showDialog:
- MaterialApp
- Scaffold
- Button // call show Dialog here
在代码示例中,这将导致如下代码,抛出上面给出的错误:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(),
home: Scaffold(
body: Center(
child: RaisedButton(
child: Text('Show dialog!'),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
child: Text('Dialog.'),
);
});
}),
),
),
);
}
}
要解决此错误,您可以创建一个新的Widget,它有自己的BuildContext。修改后的结构如下所示:
- MaterialApp
- Home
- Home // your own (Stateless)Widget
- Button // call show Dialog here
将代码示例修改为上面给出的结构,得到下面的代码 sn-p。 showDialog可以被调用而不抛出错误。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(),
home: Home()
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: RaisedButton(
child: Text('Show dialog!'),
onPressed: () {
showDialog(
context: context,
builder: (BuildContext context) {
return Dialog(
child: Text('Dialog.'),
);
});
}),
),
);
}
}