Dart中的全局变量

时间:2015-03-21 12:13:47

标签: dart global-variables

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

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

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

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

有可能吗?

7 个答案:

答案 0 :(得分:57)

只需创建一个库文件,并为您需要的全局变量创建字段。在需要访问这些字段的任何位置导入此库。

<强> 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;

你也可以
- 在全局库中创建一个单例(有关详细信息,请参阅How do you build a Singleton in Dart?) - 使用observable获取有关更改的通知(有关详细信息,请参阅Implement an Observer pattern in DartHow can i trigger a kind of onChange event in a class

答案 1 :(得分:8)

您可以创建一个类

myColors.dart

class AppColors {

  static var primary = Colors.blue;
}

并导入您的课程

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

并使用AppColors.primary

访问

答案 2 :(得分:1)

我对全局变量也有同样的问题。因此,我还需要为每个应用程序版本(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"));
     }
}

答案 3 :(得分:0)

只需在类上定义变量,然后在另一页上访问这些变量名即可。

Example: Page one define var userName = '' and on another page direct
use userName you get the page one value on page two.

答案 4 :(得分: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);
}

答案 5 :(得分:0)

您需要做的就是创建一个类似于“ constatnts.dart”的文件

import '...materials.dart';

const Color baseColor = Color(0XFF353535);

并像这样使用

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


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

),

答案 6 :(得分:0)

我创建了一个名为my-globals.dart的dart文件,可以在其中定义我的全局变量。

赞:

library globals;

int globalInt = 0;
bool globalBoolean = true;
String globalString = "";
double globalDouble= 10.0;

这就是整个飞镖文件。

然后,在同一目录或文件夹中,我可以创建其他类,在其中可以通过将my-globals.dart导入为全局变量来访问全局变量。让我们创建一个扩展StatefulWidget的类。在那里,我们将通过按下Flatbutton来更改名为globalInt的全局变量的值。

import 'package:flutter/material.dart';
import 'my-globals.dart' as globals;

class OtherClass extends StatefulWidget {
  OtherClass({Key key}) : super(key: key);

  @override
  _OtherClassState createState() => _OtherClassState();
}

class _OtherClassState extends State<OtherClass> {
  @override
  Widget build(BuildContext context) {
    return Container(
       child: FlatButton(
         color: Colors.blue,
         textColor: Colors.white,
         onPressed: () {
            setState(() {globals.globalInt++;});
            print(globals.globalInt);
         },
       ),
    );
  }
}

你知道。我只是通过编写全局变量来访问想要的变量。然后是库中包含的变量的名称。

希望此示例有所帮助,以便更好地了解如何使用全局库。