Flutter调用Material Dialog出现No MaterialLocalizations found错误如何解决?
解决Flutter中“No MaterialLocalizations found.”弹窗错误
嗨,我来帮你搞定这个弹窗打不开的问题~
问题原因
你遇到的No MaterialLocalizations found.错误,核心原因是context使用不当:你在_showMaterialDialog里传入的context是_OverAppState的上下文,这个上下文属于MaterialApp本身,而showDialog需要的是MaterialApp子树内部的上下文(只有子树里的context才能访问到Material相关的本地化资源)。
修复方法
最简便的解决方式是用Builder组件包裹你的按钮,这样就能获取到MaterialApp子树内的context,具体修改如下:
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; void main() { runApp(OverApp()); } class OverApp extends StatefulWidget { @override _OverAppState createState() => _OverAppState(); } class _OverAppState extends State<OverApp> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('List'), ), // 用Builder包裹按钮,获取子树context body: Builder( builder: (context) { return RaisedButton( child: Text('Show Material Dialog'), onPressed: () => _showMaterialDialog(context), ); }, ), ), ); } // 接收子树的context参数 _showMaterialDialog(BuildContext context) { showDialog( context: context, builder: (_) => AlertDialog( title: Text("Material Dialog"), content: Text("Hey!"), actions: <Widget>[ FlatButton( child: Text('Close me!'), onPressed: () { Navigator.of(context).pop(); }, ) ], )); } }
修改说明
- 用
Builder组件包裹RaisedButton,Builder会提供一个属于当前子树的context; - 将
_showMaterialDialog改成接收BuildContext参数的方法,传入Builder提供的context; - 这样
showDialog就能找到所需的MaterialLocalizations资源,弹窗就能正常打开啦~
另外还有一种方案是给Scaffold设置GlobalKey,通过key.currentContext来调用showDialog,不过用Builder的方式更轻量直观。
内容的提问来源于stack exchange,提问作者김동현
相关产品推荐
相关产品推荐

