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.
// If you want to use the context for anything.
final context = navigatorKey.currentState.overlay.context;
// How to insert the dialog into the display queue.
navigatorKey.currentState.overlay.insert(anyDialog);
8条答案
按热度按时间ldxq2e6h1#
我使用
navigatorKey.currentState.overlay.context
修复了这个问题。下面是一个例子:h6my8fg22#
**tl;dr:**如果你想从你的根部件调用
showDialog
,把你的代码挤出到另一个部件(例如StatelessWidget
),并在那里调用showDialog
。无论如何,在下面我将假设你遇到这个问题:
如前所述,showDialog只能在其祖先有MaterialApp的BuildContext中调用,因此如果您有这样的结构,则不能直接调用
showDialog
:在一个代码示例中,这将导致如下代码,抛出上面给出的错误:
要解决这个错误,你可以创建一个新的
Widget
,它有自己的BuildContext
。修改后的结构如下所示:将代码示例修改为上面给出的结构,得到下面的代码片段。可以调用
showDialog
而不会引发错误。xnifntxz3#
他们改变了导航器覆盖的工作方式。这是我们的工作解决方案,因为公认的一个不再是。
ibps3vxo4#
如果已经有了
context
对象,可以通过final rootContext = context.findRootAncestorStateOfType<NavigatorState>().context
获取根材质应用的上下文并将其传递给
showDialog
或showModalBottomSheet
上下文自变量。cgvd09ve5#
由于
showDialog
用于显示材质对话框,因此它只能用于显示MaterialApp
小工具内部的对话框。它不能用于显示小工具外部的对话框。s4chpxco6#
如果这对其他人有帮助的话,将navigator键注入到这样的对话框小部件中。
然后在需要模态的小部件中,您可以如上所述使用它。
ffscu2ro7#
答案就是这么简单,当你提供MaterialApp给树时,它正在提供,但在最下面你是在提供MaterialApp给树之前获得的上下文。要解决这个问题,你需要创建一个新的上下文,它将具有MaterialApp属性。为了在home和vola上面 Package 一个Builder,它正在工作...!
64jmpszr8#
对于那些希望了解如何在多个小部件/路由/文件场景中执行此操作的人,我将其与
InheritedWidget
和BuildContext
上的扩展一起使用。main.dart
home_screen.dart
app_navkey.dart
extensions.dart