当使用flutter加载副本时,如何使用localizationsDelegates远程加载本地化并显示微调器

时间:2019-12-17 12:03:20

标签: flutter

上下文:

  1. 构建我的第一个Flutter应用
  2. 它需要本地化,并且我没有使用intl包,而是使用了LocalizationsDelegates的准则(下面的代码)
  3. 我想从服务器远程加载本地化。
  4. 我希望我的应用程序立即开始显示循环进度指示器,该指示器一直保持到副本已完全远程加载,然后取消加载指示器为止。
  5. 我使用提供程序进行状态管理。
  6. ...,我很难做到这一点! :)

这是我的主要要点和起点,从不必要的线条中剔出到Q:

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateTitle: (BuildContext context) => 'MyTitle',
      localizationsDelegates: [
        const CopyDelegate(),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', ''),
        const Locale('bg', ''),
      ],
      routes: <String, WidgetBuilder>{
        '/': (BuildContext context) => Init(),
      },
    );
  }
}

这是CopyDelegates类:

class CopyDelegate extends LocalizationsDelegate<Copy> {
  const CopyDelegate();

  //TODO change the source of supported languages
  @override
  bool isSupported(Locale locale) => ['en', 'bg'].contains(locale.languageCode);

  @override
  Future<Copy> load(Locale locale) async{
    Copy copy = Copy(locale);
    copy.load();
    return copy;
  }

  @override
  bool shouldReload(CopyDelegate old) => false;
}

Copy是一个不继承的简单类,在copy.load()方法中,我有逻辑可以远程获取本地化信息。这是一个async函数,带有很多“ await”语句,这些语句进入远程配置,获取复制URL,然后从Firestore下载并将其解析为JSON字符串,并加载到Map中。 Copy然后提供检索加载的字符串的方法。

最后,这是剥离了其他内容的“ Init”小部件:

class Init extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
      //TODO add logic to transition away from spinner when copy has loaded          
      return CircularProgressIndicator();
   }
 }

我遇到的主要问题是:

  • 复制状态更改后,即“ copy.load()”完成所有异步调用后,如何通知“ Init”小部件?

0 个答案:

没有答案