如何在 BLOC、Cubit 和存储库中使用 flutter 国际化来翻译消息?

Tal*_*leb 13 localization internationalization flutter bloc cubit

我正在 Flutter 中开发一个多语言应用程序。

我使用flutter_localizations包进行本地化,使用 intl包进行国际化。

以 Widgets 内的正常方式,我可以在Context的帮助下使用它。

但问题是当我想在存储库或除 UI 层之外的其他层中使用国际化时。

除了 UI(我们无法访问Context)之外的其他层中进行国际化的最佳实践是什么,例如在 Api、Repository、Bloc 或 Cubit 中使用国际化?

注意:我正在寻找一种在应用程序的 BLOC(业务逻辑)内部使用国际化的方法,而不是 UI!

Tho*_*mas 5

一般来说,最好避免在 UI 层之外使用本地化。如果您使用 BLoC 库,则可以在 BlocListener 中显示对话框、小吃栏和类似的小部件。您还可以为您的状态编写扩展来处理 UI 层中的本地化。

但是,有一些方法可以在没有 BuildContext 的情况下使用本地化。例如:

  • 您可以使用 GetIt 等服务定位器来访问 AppLocalizations。在 GetIt 的帮助下,您将能够按类型访问实例,而无需上下文。但对于 AppLocalizations,我们需要将其注册为单例/惰性单例。请注意,您需要向您的应用程序提供这个确切的单例委托,以便您将访问与本地化委托列表中相同的对象。

简短的例子:

import 'package:get_it/get_it.dart';

GetIt getIt= GetIt.instance;

void setupServiceLocator() {
  getIt.registerLazySingleton(() => AppLocalizations());
}
Run Code Online (Sandbox Code Playgroud)
  • 您可以通过直接加载并指定区域设置来访问 LocalizationsDelegate 的实例。例如:

AppLocalizations i10n = await AppLocalizations.delegate.load(Locale('en'));

  • 您可以使用不同的本地化库,它不需要上下文来访问翻译对象(例如 easy_localization)。通过使用代码生成,您将能够在没有上下文的情况下访问翻译密钥。