他言語対応で「NoSuchMethodError」エラーが表示される場合の対処法
Apple Silicon (Apple M1チップ)のMac mini(macOS Big Sur)において、Android StudioでFlutterプロジェクトの他言語対応した文字列を取得する際に、画面上でエラーが表示されました。
NoSuchMethodError: The getter '~' was called on null.
ヒーラー
他言語対応の手順を怪しんだが、別のところに原因がありそう
問題
Flutterプロジェクトの他言語対応した文字を取得する際に、実機もしくはエミュレーターの画面上で赤バックのエラーが表示されました。
NoSuchMethodError: The getter 'title' was called on null.
Receiver: null
Tried calling: title
See also: https://flutter.dev/docs/testing/errors
AndroidStudioのコンソール上は以下エラーが表示されます。
======== Exception caught by widgets library =======================================================
The following NoSuchMethodError was thrown building MyApp(dirty):
The getter 'title' was called on null.
Receiver: null
Tried calling: title
そのときのコードがこちらです。
...
import 'package:flutter_localizations/flutter_localizations.dart';
import 'generated/l10n.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
S.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: S.delegate.supportedLocales,
title: S.of(context).title,
routes: <String, WidgetBuilder>{
"/": (_) => Splash(),
"/list": (_) => List(),
},
);
}
}
...
尚、他言語対応は、Flutter Intlパッケージをインストールして、generateされた intl_en.arb ファイルと、作成した intl_ja.arb ファイルを用意し、titleの文字列をそれぞれ設定しています。
解決方法
原因は、ローカライズの指定をしている同じ場所で、すぐに文字を取得していることでした。
この場のタイトル(MaterialAppのtitle)は固定にして、画面毎(Widget)の別のクラスから呼べば問題なく文字列が取得できました。
S.of(context).title; //en:app_title or ja:アプリタイトル
おそらく、MaterialAppの引数内ですべて完結しようとしたために、処理のタイミングの問題だと思います。
MaterialApp::localeResolutionCallbackというメソッドがあるので、Localeが決まった後でないと処理できないのだと思います。