Flutter中点击按钮触发AlertDialog时报错No MaterialLocalizations found求助
Flutter中点击按钮触发AlertDialog时报错No MaterialLocalizations found求助
嗨,我来帮你解决这个问题!你遇到的No MaterialLocalizations found错误,核心原因是你用来调用showDialog的context没有访问到MaterialApp内部的本地化资源。
你代码里的context是Hello这个StatelessWidget的build方法提供的,而MaterialApp是这个context的子组件——也就是说,这个context在MaterialApp的“上层”,没法获取到MaterialApp内部生成的MaterialLocalizations实例,而AlertDialog需要这个资源来处理按钮文本、布局适配等本地化相关的逻辑。
下面给你两种简单的修复方案:
方案一:把首页内容抽成独立Widget
把原来的Scaffold部分单独拆成一个新的StatelessWidget,这样新Widget的context就属于MaterialApp的子上下文,能正常访问到本地化资源:
import 'package:flutter/material.dart'; void main() { runApp(const Hello()); } class Hello extends StatelessWidget { const Hello({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( home: HomePage(), // 指向新的首页Widget ); } } // 新增的首页Widget class HomePage extends StatelessWidget { const HomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: () { showDialog( context: context, // 这里的context是HomePage的,属于MaterialApp子上下文 builder: (context) => AlertDialog( actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, child: const Text('Close'), ) ], title: const Text('Alert Check'), content: const Text('Alert Box has Appear!!'), contentPadding: const EdgeInsets.all(20), ), ); }, child: const Text('Alert'), ), ), ); } }
方案二:用Builder包裹按钮
如果不想拆组件,也可以用Builder widget包裹ElevatedButton,Builder会提供一个能访问到MaterialApp内部资源的子context:
import 'package:flutter/material.dart'; void main() { runApp(const Hello()); } class Hello extends StatelessWidget { const Hello({super.key}); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Center( // 用Builder包裹按钮 child: Builder( builder: (innerContext) => ElevatedButton( onPressed: () { showDialog( context: innerContext, // 使用Builder提供的innerContext builder: (context) => AlertDialog( actions: [ TextButton( onPressed: () { Navigator.of(context).pop(); }, child: const Text('Close'), ) ], title: const Text('Alert Check'), content: const Text('Alert Box has Appear!!'), contentPadding: const EdgeInsets.all(20), ), ); }, child: const Text('Alert'), ), ), ), ), ); } }
两种方案都能解决你的问题,你可以根据自己的代码结构选择合适的方式~
备注:内容来源于stack exchange,提问作者Suman Devkota
相关产品推荐
相关产品推荐

