在Flutter中万物皆是Widget,因为Widget不仅仅承担封装绘制层的作用,同样可以封装着纯逻辑的功能,详情参考《Flutter中的Widget、Element和RenderObject是如何协同工作的》这篇文章。
所以,Flutter把国际化的功能封装在一个Widget中,这个Widget就是Localizations。Localizations主要的作用是提供了根据语言环境Locale加载对应资源的能力。
Localizations有2个主要的参数:
- locale
就是Locale对象,表示当前的语言环境。
详情参考Flutter组件国际化(二):Locale详解
- 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";
}
}
在Flutter中万物皆是Widget,因为Widget不仅仅承担封装绘制层的作用,同样可以封装着纯逻辑的功能,详情参考《Flutter中的Widget、Element和RenderObject是如何协同工作的》这篇文章。
所以,Flutter把国际化的功能封装在一个Widget中,这个Widget就是Localizations。Localizations主要的作用是提供了根据语言环境Locale加载对应资源的能力。
Localizations有2个主要的参数:
- locale
就是Locale对象,表示当前的语言环境。
详情参考Flutter组件国际化(二):Locale详解
- 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";
}
}
在Flutter中万物皆是Widget,因为Widget不仅仅承担封装绘制层的作用,同样可以封装着纯逻辑的功能,详情参考《Flutter中的Widget、Element和RenderObject是如何协同工作的》这篇文章。
所以,Flutter把国际化的功能封装在一个Widget中,这个Widget就是Localizations。Localizations主要的作用是提供了根据语言环境Locale加载对应资源的能力。
Localizations有2个主要的参数:
- locale
就是Locale对象,表示当前的语言环境。
详情参考Flutter组件国际化(二):Locale详解
- 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";
}
}