如何在 Flutter App 中拥有全局单例对象

How to have a global singleton object in Flutter App

我想要一个单例对象(即 ConfigManager)能够 return 配置对象(例如 EnglishLocale)并使其在整个应用程序生命周期内可用。 让我们举个例子:

  1. 用户第一次启动应用程序时,系统会要求他选择默认语言(例如英语、法语、意大利语...)。
  2. 动态创建 ConfigManager 单例并绑定到 Locale 对象(包含该语言的所有硬编码字符串)。

当我需要一个特定的字符串时,我只需要做类似

的事情
ConfigManager.instance.locale.myString;

现在,我查看了 here 以了解 Dart 中的工作原理。单例创建部分很清楚,但是我需要根据我所说的用户输入提供不同的配置。

查看下图以获得更多示意图:

编辑 1,现在,这是我到目前为止所做的:

class ConfigManager {
  Locale loc;
  static ConfigManager _instance;
  factory ConfigManager(Locale loc) => _instance ??= new ConfigManager._(loc);

  ConfigManager._(Locale loc);

  static get instance => _instance;
}

通过这种方式,当我决定获取一个特定的字符串时,我可以使用以下语法:

ConfigManager.instance.loc.presentation1body

这是初始化阶段

ConfigManager(new EnglishLocale());

但是我继续收到错误

"the getter was called on null"

我有点迷茫,请帮帮我。

使用 const 构造函数怎么样?下面是 flutter 是如何做到的。

// full source code in /sky_engine/lib/ui/painting.dart
class Colors {

     const Color(int value) : value = value & 0xFFFFFFFF;

     static const Color white = Color(0xFFFFFFFF);

} 

然后通过调用 Colors.white

来使用它
class YourApp extends StatelessWidget {
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            title: 'your app',
            theme: ThemeData(
                primaryColor: Colors.white,
            ),
        );
    }
}

实际上,以下代码有效:

class ConfigManager {
   Locale loc;
   static ConfigManager _instance;
   factory ConfigManager() => _instance ??= new ConfigManager._();

   void init(Locale loc) {
      this.loc = loc;
   }

   ConfigManager._();
}

使用 init 方法,我可以将需要的东西分配给我的 Singleton ConfigManager,以便稍后即时获得我需要的东西。 然而,我会在更高的性能和代码优雅方面做更多的研究(可能有不同的模式)。