You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:53:20