Flutter 为 AppLocalization.of(context) 返回 null

Sea*_*les 22 localization internationalization dart flutter

我正在使用 Flutter 构建一个 Web 应用程序,我想在我的新应用程序上使用 flutter 的国际化功能。我正在关注Flutter-Tutorial,并尝试使用 arb 文件设置应用程序标题。正如教程中提到的,app_localization.dart 文件是为“en”和“de”正确创建的。然而,我在下面的代码中遇到了空指针异常。

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'MyApp',
      localizationsDelegates: [
        AppLocalizations.delegate, // Post-EDIT due to croxx5f
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('de', ''),
        Locale('en', ''),
      ],
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text(AppLocalizations.of(context)!.appTitle),
        ),
        body: Text(AppLocalizations.of(context)!.appTitle)
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

事实上,AppLocalizations.of(context) 返回 null。

cro*_*x5f 22

您应该在您的 MaterialApp 中添加AppLocalizations

MaterialApp(
...
      localizationsDelegates: const [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
      ],
      supportedLocales: AppLocalizations.supportedLocales,
...
Run Code Online (Sandbox Code Playgroud)

  • 具体来说,本教程中缺少“AppLocalizations.delegate”行。 (4认同)
  • @cksrc,那不是真的。Flutter 确实在其文档中提供了示例代码。https://docs.flutter.dev/development/accessibility-and-localization/internationalization 他们确实提到了这一行 `AppLocalizations.delegate, // 添加这一行` (3认同)
  • 尝试运行 `flutter clean && flutter pub get dependency && flutter packages get` 以触发 .arb 中的代码生成 (2认同)

Raj*_*Jr. 20

就我而言,使用Scaffold()as home:ofMaterialApp()进行测试导致了问题。

一旦我创建了一个单独的HomePage()小部件并使用它, home: HomePage()问题就消失了。

当我将 Scaffold() 作为 MaterialApp 的直接子级时,会认为 AppLocalizationDelegate 没有可用的父上下文,因为 MaterialApp 是所有底层小部件的主要上下文构建器。

错误代码:

return MaterialApp(
                home: Scaffold(
                  body: Txt(text: AppLocalizations.of(context)?.helloWorld)
                ),
                locale: Locale('ar'),
                supportedLocales: [Locale('en'),Locale('ar')],
                localizationsDelegates: [
                  AppLocalizations.delegate,
                  GlobalMaterialLocalizations.delegate,
                  GlobalCupertinoLocalizations.delegate,
                  GlobalWidgetsLocalizations.delegate,
                ]);
          },
        ));
Run Code Online (Sandbox Code Playgroud)

好的代码:

return MaterialApp(
                home: HomePag(),
                locale: Locale('ar'),
                supportedLocales: [Locale('en'),Locale('ar')],
                localizationsDelegates: [
                  AppLocalizations.delegate,
                  GlobalMaterialLocalizations.delegate,
                  GlobalCupertinoLocalizations.delegate,
                  GlobalWidgetsLocalizations.delegate,
                ]);
          },
        ));



class HomePag extends StatefulWidget {
  const HomePag({Key? key}) : super(key: key);

  @override
  State<HomePag> createState() => _HomePagState();
}

class _HomePagState extends State<HomePag> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          children: [
            Txt(text: AppLocalizations.of(context)?.helloWorld),
            // Txt(text: AppLocalizations.of(context)?.translate('help'))
          ],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 天哪,这解决了我的问题,非常感谢。有人知道这里有什么问题吗? (2认同)