使用ARB进行Flutter本地化-在null上调用getter

问题描述

我已经遇到这个错误已有一段时间了,我认为我需要一些专家的帮助才能解决它,并且我真的是这种语言的新手^^。

我在Flutter中向我的项目添加了可本地化,以不同的语言添加了所有files.arb,并尝试按照Google教程以及其他一些不同的解决方法将其导入,但始终收到相同的错误

    ════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following NoSuchMethodError was thrown building StyleguideScreen(dirty):
The getter 'welcomeGeneralInfoTitle' was called on null.
Receiver: null
Tried calling: welcomeGeneralInfoTitle

这是我用于localicationDelegates的AppLocalizations.dart类

class AppLocalizations {
  static const AppLocalizationsDelegate delegate = AppLocalizationsDelegate();

  static Future<AppLocalizations> load(Locale locale) {
    final String name = locale.countryCode.isEmpty ? locale.languageCode : locale.toString();
    final String localeName = Intl.canonicalizedLocale(name);

    return initializeMessages(localeName).then((_) {
      Intl.defaultLocale = localeName;
      return AppLocalizations();
    });
  }

  static AppLocalizations of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context,AppLocalizations);
  }

  String get welcomeGeneralInfoTitle {
    return Intl.message('Bet Master',name: 'title',desc: 'App Title');
  }
}

class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  const AppLocalizationsDelegate();
  
  List<Locale> get supportedLocales {
    return const <Locale>[
      Locale('en',''),Locale('de',Locale('es','ES'),]; //Still need to add 18 languages,is there a better way to add them?
  }

  @override
  bool isSupported(Locale locale) => _isSupported(locale);

  @override
  Future<AppLocalizations> load(Locale locale) => AppLocalizations.load(locale);

  @override
  bool shouldReload(AppLocalizationsDelegate old) => false;

  bool _isSupported(Locale locale) {
    if (locale != null) {
      for (Locale supportedLocale in supportedLocales) {
        if (supportedLocale.languageCode == locale.languageCode) {
          return true;
        }
      }
    }
    return false;
  }
}

这是我添加到项目根目录的地方

return MaterialApp(
      localizationsDelegates: [
        AppLocalizations.delegate,GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,],supportedLocales: AppLocalizations.delegate.supportedLocales,title: 'AMP',theme: Theme.darkTheme,home: StyleguideScreen(),);

这是我尝试实现它的方法,并且崩溃

class StyleguideScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final welcome = AppStrings.current.welcomeGeneralInfoTitle;
    return Scaffold(...)
 }
}

该应用程序正确地生成了需要导入的每种语言的所有生成文件,我认为它看起来非常简单,在调试时,它可以正确获取 locale 。有谁知道为什么会这样?在此先感谢:pray:

解决方法

FIX:我只需要将localizationsDelegates文件中自动生成的 AppStrings.delegate,添加到import 'generated/l10n.dart';中,而不是创建一个新的AppLocalizations.delegate。 像这样:

localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate,GlobalCupertinoLocalizations.delegate,AppStrings.delegate,],

并完全删除我所做的AppLocationzations类,它运行顺利! :)

PD:我添加了这个新库flutter_localized_locales

,

我将 Android Studio Flutter 与 Intl plugin 一起使用,但问题是一样的

main.dart中添加导入import 'generated/l10n.dart';

同时在 localizationsDelegates 列表中添加 S.delegate

localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,S.delegate,

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...