Global Variables in Dart

I try to create a Dart single page application.

I have created a first custom element (custom-application) which contains the whole application. It has a container in it which is used to render views. And a side nav which will contain user informations and be updated when the user is log in.

I want to share informations between views. How can I define a global variable in custom-application and be able to share it with the other views ?

For example, when you start the app, you are not authenticated. When you call /login (login-view) you'll have a login form. I want, when you log in the application, the custom-application element stores the user informations loaded by the nested view login-view and update the side nav.

Is it possible to do it ?

190853 次浏览

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

App Dart

import 'globals.dart' as globals;


main() {
globals.isLoggedIn = true;
}

组件1.dart

import 'globals.dart' as globals;


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

全球,飞镖

library my_prj.globals;


bool isLoggedIn = false;

你也可以

++++ Update July 2019 ++++

我写了一个包,集成扑动全局配置。

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

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 中编写配置。飞镖或主刺。飞镖档案。

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

Https://github.com/ephenodrom/flutter-global-config

使用方法:

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

将 asset/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"));
}
}

您可以创建一个类

myColors.dart

class AppColors {


static var primary = Colors.blue;
}

And importing your class

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

AppColors.primary的访问权限

Based on the library idea, here a way to add "keyed" global variables of any type to a map called from other widgets. This way you do not have to declare such variables beforehand. If a variable does not exist it is added to the map by 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);
}

你只需要创建一个像“ Constants.dart”这样的文件

import '...materials.dart';


const Color baseColor = Color(0XFF353535);

像这样使用

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




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

),

我创建了一个 dart 文件,我称之为 my-globals. dart,在这里我可以定义全局变量。

像这样:

library globals;


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

这是整个 Dart 文件。

然后,在同一个目录或文件夹中,我可以创建其他类,在这些类中,我可以通过导入 my-globals 来访问全局变量。全球性的飞镖。让我们创建一个类来扩展状态组件。在这里,我们将通过按一个平面按钮来更改名为 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);
},
),
);
}
}

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

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

全局变量通常不受欢迎。推荐的颤振解决方案是提供程序库。它只是一个插入到小部件树高处的小部件,并赋予它一些值(对象、类)来保存它。然后访问其他小部件内部更深层次的值。

与全局变量相反,您可以修改提供程序存储的值,而且内部的小部件将重新呈现。

Pub.dev/Provider

Store value

  Widget build(BuildContext context) {
String someValue = '5';
return Provider(
create: (_) => someValue),
child: SafeArea(...)
);
}

取值:

  @override
void initState() {
super.initState();


WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
setState(() {
value5 = context.read<String>();
});
});
}