【问题标题】:How to have a global singleton object in Flutter App如何在 Flutter App 中拥有一个全局单例对象
【发布时间】:2020-06-10 23:08:50
【问题描述】:

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

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

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

ConfigManager.instance.locale.myString;

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

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

编辑 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());

但是我继续收到错误

"getter 在 null 上被调用"

我有点困惑,请帮帮我。

【问题讨论】:

    标签: flutter dart configuration singleton


    【解决方案1】:

    实际上,下面的代码是有效的:

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

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

    【讨论】:

      【解决方案2】:

      使用 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,
                  ),
              );
          }
      }
      

      【讨论】:

      • 感谢您的回答!在我看来,这将是类似 javascript 的东西。但是我试图在不同的方法和相对的性能/代码优雅之间进行比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多