987aad4c9c6329190b263acfd2889b03
Flutter 组件国际化(三):Localizations详解

在Flutter中万物皆是Widget,因为Widget不仅仅承担封装绘制层的作用,同样可以封装着纯逻辑的功能,详情参考《Flutter中的Widget、Element和RenderObject是如何协同工作的》这篇文章。

所以,Flutter把国际化的功能封装在一个Widget中,这个Widget就是Localizations。Localizations主要的作用是提供了根据语言环境Locale加载对应资源的能力。

Localizations有2个主要的参数:

  1. locale
    就是Locale对象,表示当前的语言环境。
    详情参考Flutter组件国际化(二):Locale详解
  2. delegates
    delegates代表一个LocalizationsDelegate对象的列表。前面我们说到,Localizations提供了根据语言环境Locale加载资源的能力,而加载什么资源,怎么样加载,加载资源后的结果类都是需要开发者自定义的。所以,Localizations使用了代理模式,把这些逻辑都交给了LocalizationsDelegate,然后开发者就可以自定义逻辑。而Localizations所做的就是在Widget的生命周期内管理这些delegates,在适当的时候加载。

下面我们来看一下LocalizationsDelegate:


abstract class LocalizationsDelegate<T> {
  const LocalizationsDelegate();

  /// 是否支持当前Locale
  bool isSupported(Locale locale);

  // 加载资源,以及返回资源实例T
  // 并且T可以作为Key通过Localization.of取出T的实例
  Future<T> load(Locale locale);

  // 当Localizations didUpdateWidget时,判断是否需要重新加载资源
  bool shouldReload(covariant LocalizationsDelegate<T> old);

  // 把T作为资源Map的Key
  Type get type => T;

  @override
  String toString() => '$runtimeType[$type]';
}

可以看到LocalizationsDelegate的主要作用就是定义了load资源的逻辑,以及返回的资源实例T。T是一个开发者自定义的数据结构,用来存放自定义的多语言资源,比如title,图片路径等等。


// 定义T类型的基类 abstract class CustomLocalizations { String get title; } // 定义在中文环境中,load返回的ZhLocalizations资源类 class ZhLocalizations implements CustomLocalizations{ //Locale相关值,title为应用标题 String get title { return "Flutter应用"; } } // 定义在英语环境中,load返回EnLocalizations资源类 class EnLocalizations implements CustomLocalizations { //Locale相关值,title为应用标题 String get title { return "Flutter APP"; } }

top Created with Sketch.