【Flutter】他言語対応で文字列取得時に「NoSuchMethodError」でnullが返る場合の解決方法
notwork_flutter_localize
スポンサーリンク

他言語対応で「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の文字列をそれぞれ設定しています。

main.dart

解決方法

原因は、ローカライズの指定をしている同じ場所で、すぐに文字を取得していることでした。

この場のタイトル(MaterialAppのtitle)は固定にして、画面毎(Widget)の別のクラスから呼べば問題なく文字列が取得できました。

main.dart
S.of(context).title; //en:app_title or ja:アプリタイトル

おそらく、MaterialAppの引数内ですべて完結しようとしたために、処理のタイミングの問題だと思います。

MaterialApp::localeResolutionCallbackというメソッドがあるので、Localeが決まった後でないと処理できないのだと思います。
スポンサーリンク

Twitterでフォローしよう

おすすめの記事