Flutter Localizations空检查报错:NavigationDrawer本地化获取失败
问题原因
你在MyPageState的build方法中额外创建了一个MaterialApp,这个内层MaterialApp未配置localizationsDelegates和supportedLocales,导致它的子树(包括NavigationDrawer)无法获取到本地化实例。而AppLocalizations.of(context).appname能正常工作,是因为调用时使用的context属于外层MaterialApp(main函数中定义的那个),该上下文已包含完整的本地化配置。
解决方案
移除MyPageState内的MaterialApp,将主题、本地化等全局配置统一放到应用根节点的MaterialApp中,确保整个应用共享同一个本地化上下文。
修改后的完整代码:
import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: AppLocalizations.of(context).appname, localizationsDelegates: [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, GlobalCupertinoLocalizations.delegate, ], supportedLocales: [ Locale('en'), Locale('ja'), ], theme: ThemeData.light(), darkTheme: ThemeData.dark(), themeMode: ThemeMode.system, home: const MyPage(), ); } } /// A simple app that loads an adaptive banner ad. class MyPage extends StatefulWidget { const MyPage({super.key}); @override MyPageState createState() => MyPageState(); } class NavigationDrawer extends StatelessWidget { const NavigationDrawer({Key? key}) : super(key: key); @override Widget build(BuildContext context) => Drawer( child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ buildMenuItems(context), ], ), ), ); Widget buildMenuItems(BuildContext context) => Container( padding: const EdgeInsets.all(24), child: Wrap( runSpacing: 16, children: [ ListTile( leading: const Icon(Icons.person), title: Text(AppLocalizations.of(context).person), onTap: (){}, ), ], ), ); } class MyPageState extends State<MyPage> { final _key = GlobalKey<ScaffoldState>(); @override Widget build(BuildContext context) { return Scaffold( key: _key, appBar: AppBar( title: Text(AppLocalizations.of(context).appname), ), drawer: SafeArea( bottom: false, child: const NavigationDrawer(), ), body: Stack(), ); } }
修改说明
- 将全局配置(本地化、主题)统一放到根组件
MyApp的MaterialApp中,作为应用唯一的根节点 MyPageState直接返回Scaffold,不再创建新的MaterialApp,让NavigationDrawer的上下文继承外层的本地化信息- 避免多
MaterialApp导致的上下文隔离问题,确保全局资源(如本地化)能在整个应用树中共享
内容的提问来源于stack exchange,提问作者riez0306
相关产品推荐
相关产品推荐

