Flutter ARB 本地化抛出 "the getter was called on null" 错误

Flutter ARB localization throws "the getter was called on null" error

按照 official internationalization tutorial 的提示,我在尝试使用从 ARB 文件自动生成的翻译引擎 (AppLocalizations.of(context).helloWrold) 时得到 The getter was called on null:

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

class Login extends StatelessWidget {
  final loginAction;
  final String loginError;

  const Login(this.loginAction, this.loginError);

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        RaisedButton(
          onPressed: () {
            loginAction();
          },
          child: Text(AppLocalizations.of(context).helloWorld),
        ),
        Text(loginError ?? ''),
      ],
    );
  }
}

这个问题的解决方法是官方教程遗漏的部分。那里没有描述要让引擎运行,需要在 main.dart 文件中声明额外的委托。这样就可以得出结论了example GitHub repository。要解决此问题,请转到 MaterialApp 并添加缺少的委托 AppLocalizations.delegate:

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


      child: MaterialApp(
          localizationsDelegates: [
            // ... app-specific localization delegate[s] here
            AppLocalizations.delegate,
            GlobalMaterialLocalizations.delegate,
            GlobalWidgetsLocalizations.delegate,
            GlobalCupertinoLocalizations.delegate,
          ],
          supportedLocales: [
            const Locale('en', ''),
            const Locale('pl', '')
          ],
          home: Scaffold(