Dart中的全局变量


76

我尝试创建Dart单页应用程序。

我创建了第一个自定义元素(custom-application),其中包含整个应用程序。它具有一个用于呈现视图的容器。侧面导航将包含用户信息,并在用户登录时进行更新。

我想在视图之间共享信息。如何在中定义全局变量custom-application并能够与其他视图共享?

例如,当您启动应用程序时,您未通过身份验证。致电/ login(login-view)时,您将获得一个登录表单。我想在登录应用程序时,该custom-application元素存储由嵌套视图加载的用户信息login-view并更新侧面导航。

有可能做到吗?

Answers:


159

只需创建一个库文件,然后为您需要的全局变量创建字段。在需要访问这些字段的任何地方导入该库。

app.dart

import 'globals.dart' as globals;

main() {
  globals.isLoggedIn = true;
}

component1.dart

import 'globals.dart' as globals;

class MyComponent {
  view() {
    if(globals.isLoggedIn) {
      doSomething();
    else {
      doSomethingElse();
    }
  }
}

globals.dart

library my_prj.globals;

bool isLoggedIn = false;

你也可以


它工作正常。感谢您的支持和所有链接。我要检查。
T00rk 2015年

3
我终于成功地使用可观察的模式获得了可观察的全局变量。效果很好。再次谢谢你。
T00rk 2015年

2
抱歉,我很抱歉-我的评论有点脱离上下文了。否-从我尝试过的有限测试中,当从compute执行的回调中访问全局变量时,这似乎不起作用。有时间的时候,我会把它摆成一个适当的问题。
猎人'18

1
@GünterZöchbauer文件中的内容是library my_prj.globals什么globals.dart
Fadhil

1
该库声明在早期的Dart版本中是强制性的,但最终成为可选的,我认为没有人再使用它了。每个不是零件文件的Dart文件都需要一个唯一的库声明。如果未明确添加,则从文件名+路径派生。
君特Zöchbauer

8

您可以创建一个类

myColors.dart

class AppColors {

  static var primary = Colors.blue;
}

并导入您的课程

import 'package:myapp/.../myColors.dart';

和访问 AppColors.primary


4

++++ 2019年7月更新++++

我写了一个包含Flutter Global Config的Package。

EZ Flutter是小部件,程序包和更多有用的东西的集合,它们混合在一个很小的框架中。目的是使标准功能从头开始可用。EZ Flutter支持管理可在应用程序内部访问的不同配置文件。

GitHub:https : //github.com/Ephenodrom/EZ-Flutter

dependencies:
  ez_flutter: ^0.2.0

查看文档,了解如何使用不同的配置。

https://github.com/Ephenodrom/EZ-Flutter/blob/master/documentation/APPLICATION_SETTINGS.md

++++旧答案++++

我对全局变量也有同样的问题。因此,我还需要为每个应用程序版本(dev / prod)使用不同的配置,并且我不想在main_dev.dart或main_prod.dart文件中写入配置。

我写了一个简单的flutter程序包,处理单独的配置文件并在应用程序启动时加载它们。然后,可以在应用程序的每一行代码中使用该配置。

https://github.com/Ephenodrom/Flutter-Global-Config

如何使用它 :

在assets / cfg / $ file.json下创建一个json文件

将资产/ cfg添加到您的pubspec.yaml

在应用启动时加载不同的配置文件:

import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';

void main() async{
  await GlobalConfiguration().loadFromAsset("app_settings");
  await GlobalConfiguration().loadFromAsset("env_dev_settings");
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  ...
}

在您的应用中使用配置:

import 'package:flutter/material.dart';
import 'package:global_configuration/global_configuration.dart';

class CustomWidget extends StatelessWidget {

    CustomWiget(){
        // Access the config in the constructor
        print(GlobalConfiguration().getString("key1"); // prints value1
    }

    @override
     Widget build(BuildContext context) {
        // Access the config in the build method
        return new Text(GlobalConfiguration().getString("key2"));
     }
}

0

基于库的思想,这里提供了一种将任何类型的“键控”全局变量添加到从其他小部件调用的映射中的方法。这样,您不必事先声明此类变量。如果变量不存在,则通过appDataSet将其添加到地图。因此,在复选框之类的小部件中,您可以在setState()函数中添加例如:appDataSet('aCheckBox',value); 如果地图中不存在aCheckBox,则将其添加并用value(在这种情况下为boolean)加载该值。

library my_prj.globals;

Map appData = Map<String,dynamic>();

void appDataSet(String key, dynamic value) {
  if (!appData.containsKey(key))
    appData.putIfAbsent(key, () => value);
  else
    appData.update(key, (dynamic) => value);
  print(appData);
}

dynamic appDataGet(String key) {
  if (appData.containsKey(key))
    return (appData.putIfAbsent(key, () => {}));
  else
    return (null);
}

0

您只需要创建一个文件“ constatnts.dart”

import '...materials.dart';

const Color baseColor = Color(0XFF353535);

像这样使用

import '...constants.dart';
.......
......


....
Container(
color: baseColor,
.....

),

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.