如何在Flutter App中拥有一个全局的单子对象

问题描述 投票:1回答:1

我希望有一个单人对象(即ConfigManager)能够返回一个配置对象(如EnglishLocale),并在整个应用程序生命周期中保持它的可用性。

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

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

ConfigManager.instance.locale.myString;

现在,我已经看了 此处 为了了解Dart的工作原理。Singleton的创建部分很清楚,但是我需要根据用户的输入提供不同的配置,就像我说的那样。

请看下面的图片以获得更多的示意图。

enter image description here

编辑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"

我有点困惑,请帮帮我。

flutter dart configuration singleton
1个回答
1
投票

实际上,下面的代码是可行的。

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

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

   ConfigManager._();
}

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


0
投票

下面是flutter的做法,使用constructor怎么样?

// 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,
            ),
        );
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.