如何在 Flutter App 中拥有全局单例对象
How to have a global singleton object in Flutter App
我想要一个单例对象(即 ConfigManager)能够 return 配置对象(例如 EnglishLocale)并使其在整个应用程序生命周期内可用。
让我们举个例子:
- 用户第一次启动应用程序时,系统会要求他选择默认语言(例如英语、法语、意大利语...)。
- 动态创建 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,以便稍后即时获得我需要的东西。
然而,我会在更高的性能和代码优雅方面做更多的研究(可能有不同的模式)。
我想要一个单例对象(即 ConfigManager)能够 return 配置对象(例如 EnglishLocale)并使其在整个应用程序生命周期内可用。 让我们举个例子:
- 用户第一次启动应用程序时,系统会要求他选择默认语言(例如英语、法语、意大利语...)。
- 动态创建 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,以便稍后即时获得我需要的东西。 然而,我会在更高的性能和代码优雅方面做更多的研究(可能有不同的模式)。