Flutter:如何在构建开始前获取设备语言环境列表?

Flutter: How can I get list of device locales before building starts?

我想将我的应用程序国际化。为了简化翻译,我想使用 i18n_extension 包。

在任何小部件构建过程开始之前,我需要获取设备区域设置列表(任何设备,甚至网络)。

这对于 I18nLocalizations(在 WidgetsApp 中)初始设置正确的语言环境(可以从服务器获取)是必需的。

我发现获取设备语言环境列表的唯一方法是:

MaterialApp(
  localeListResolutionCallback: (deviceLocales, appLocales) => myLocaleResolution(deviceLocales, appLocales),
  locale: thisAppsLocale,
  home: I18n(
    child: MyHomePage(),
    initialLocale: thisAppsLocale, ),

方法 myLocaleResolution 设置 thisAppsLocale。方法在启动时和用户更改设备区域设置时调用一次。因此 thisAppsLocale 仅在第一个构建过程 之后可用,不能用于设置 localeinitialLocale。在 myLocaleResolution 中使用 setState() 会在启动调用时引发异常。

使用window.locales:

import 'dart:ui';
import 'package:flutter/material.dart';

void main(){
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      locale: window.locale,
      supportedLocales: window.locales,
      home: Scaffold(),
    );
  }
}

window 单例允许您访问 Window class。