Dart中的全局变量

T00*_*0rk 49 global-variables dart

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

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

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

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

有可能吗?

Gün*_*uer 81

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

app.dart

import 'globals.dart' as globals;

main() {
  globals.isLoggedIn = true;
}
Run Code Online (Sandbox Code Playgroud)

component1.dart

import 'globals.dart' as globals;

class MyComponent {
  view() {
    if(globals.isLoggedIn) {
      doSomething();
    else {
      doSomethingElse();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

globals.dart

library my_prj.globals;

bool isLoggedIn = false;
Run Code Online (Sandbox Code Playgroud)

您还可以
- 在globals库中创建一个单例(有关详细信息,请参阅如何在Dart中构建Singleton?).
- 使用observable获取有关更改的通知(请参阅在Dart中实现Observer模式,如何在类中触发一种onChange事件以获取更多详细信息)

  • @GünterZöchbauer `library my_prj.globals` 在 `globals.dart` 文件中做什么? (5认同)
  • 我终于成功地使用可观察模式将全局变量作为可观察对象.它工作得很好.再次感谢你. (2认同)
  • 抱歉,我很抱歉-我的评论有点脱离上下文了。否-从我尝试过的有限测试中,当从compute执行的回调中访问全局变量时,这似乎不起作用。我有时间的时候把它摆成一个适当的问题。 (2认同)
  • 该库声明在早期的 Dart 版本中是强制性的,但最终变成了可选的,我认为没有人再使用它了。每个不是零件文件的 Dart 文件都需要一个唯一的库声明。当未明确添加时,它是从文件名+路径派生的。 (2认同)

Ivá*_*oed 17

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

像这样:

library globals;

int globalInt = 0;
bool globalBoolean = true;
String globalString = "";
double globalDouble= 10.0;
Run Code Online (Sandbox Code Playgroud)

这就是整个 dart 文件。

然后,在同一目录或文件夹中,我可以创建其他类,在其中我可以通过导入 my-globals.dart 作为全局变量来访问我的全局变量。让我们创建一个扩展 StatefulWidget 的类。我们将通过按下 Flat 按钮来更改名为 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);
         },
       ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

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

希望这个例子有助于更好地理解如何使用全局库。


Álv*_*ero 16

你可以创建一个类

myColors.dart

class AppColors {

  static var primary = Colors.blue;
}
Run Code Online (Sandbox Code Playgroud)

并导入您的课程

import 'package:myapp/.../myColors.dart';
Run Code Online (Sandbox Code Playgroud)

并访问 AppColors.primary

  • 静态变量不是在 dart 中访问和更新变量的首选方式。静态变量可能会丢失跨文件的数据(请参阅 /sf/ask/3204062291/ )。 (4认同)

Eph*_*rom 5

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

我写了一个集成了 Flutter 全局配置的包。

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

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

dependencies:
  ez_flutter: ^0.2.0
Run Code Online (Sandbox Code Playgroud)

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

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文件

将 assets/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 {
  ...
}
Run Code Online (Sandbox Code Playgroud)

在您的应用程序中使用配置:

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"));
     }
}
Run Code Online (Sandbox Code Playgroud)