Globale Variablen in Dart

76

Ich versuche, eine Dart-Einzelseitenanwendung zu erstellen.

Ich habe ein erstes benutzerdefiniertes Element ( custom-application) erstellt, das die gesamte Anwendung enthält. Es enthält einen Container, mit dem Ansichten gerendert werden. Und ein Seitennavigationssystem, das Benutzerinformationen enthält und aktualisiert wird, wenn sich der Benutzer anmeldet.

Ich möchte Informationen zwischen Ansichten teilen. Wie kann ich eine globale Variable definieren custom-applicationund mit anderen Ansichten teilen?

Wenn Sie beispielsweise die App starten, werden Sie nicht authentifiziert. Wenn Sie / login ( login-view) aufrufen, erhalten Sie ein Anmeldeformular. Ich möchte, dass das custom-applicationElement beim Anmelden in der Anwendung die von der verschachtelten Ansicht geladenen Benutzerinformationen speichert login-viewund das Seitennavigationsprogramm aktualisiert.

Ist es möglich das zu tun?

T00rk
quelle

Antworten:

159

Erstellen Sie einfach eine Bibliotheksdatei und erstellen Sie Felder für die dort benötigten Globals. Importieren Sie diese Bibliothek überall dort, wo Sie Zugriff auf diese Felder benötigen.

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;

Du kannst auch

Günter Zöchbauer
quelle
Es funktioniert gut. Vielen Dank für diese und alle Links. Ich werde nachsehen.
T00rk
3
Es ist mir endlich gelungen, eine globale Variable anhand des beobachtbaren Musters als beobachtbar zu erhalten. Es funktioniert sehr gut. Danke nochmal.
T00rk
2
Hoppla, ich entschuldige mich - mein Kommentar war etwas unzusammenhängend. Nein - von den begrenzten Tests, die ich versucht habe, scheint dies nicht zu funktionieren, wenn über den von compute ausgeführten Rückruf auf Globals zugegriffen wird. Ich werde es als richtige Frage stellen, wenn ich Zeit habe.
Jäger
1
@ GünterZöchbauer was macht library my_prj.globalsman in globals.dartdatei?
Fadhil
1
Diese Bibliotheksdeklaration war in früheren Dart-Versionen obligatorisch, wurde aber schließlich optional und ich denke, niemand verwendet sie mehr. Jede Dart-Datei, die keine Teiledatei ist, benötigt eine eindeutige Bibliotheksdeklaration. Wenn es nicht explizit hinzugefügt wird, wird es vom Dateinamen + Pfad abgeleitet.
Günter Zöchbauer
8

Sie können eine Klasse erstellen

myColors.dart

class AppColors {

  static var primary = Colors.blue;
}

Und importiere deine Klasse

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

Und Zugriff mit AppColors.primary

Álvaro Agüero
quelle
4

++++ Update Juli 2019 ++++

Ich habe ein Paket geschrieben, das die Flutter Global Config integriert.

EZ Flutter ist eine Sammlung von Widgets, Paketen und vielen weiteren nützlichen Dingen, die in einem kleinen Rahmen zusammengefasst sind. Ziel ist es, Standardfunktionen von Grund auf neu verfügbar zu machen. EZ Flutter unterstützt die Verwaltung verschiedener Konfigurationsdateien, auf die innerhalb der App zugegriffen werden kann.

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

dependencies:
  ez_flutter: ^0.2.0

Lesen Sie in der Dokumentation nach, wie die Verwendung verschiedener Konfigurationen funktioniert.

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

++++ Alte Antwort ++++

Ich hatte das gleiche Problem mit globalen Variablen. Daher brauchte ich auch eine andere Konfiguration für jede App-Version (dev / prod) und ich möchte die Konfiguration nicht in die Datei main_dev.dart oder in die Datei main_prod.dart schreiben.

Ich habe ein einfaches Flatterpaket geschrieben, das sich mit getrennten Konfigurationsdateien befasst und diese beim Start der App lädt. Die Konfiguration ist dann in jeder Codezeile Ihrer App verfügbar.

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

Wie man es benutzt:

Erstellen Sie eine JSON-Datei unter Assets / cfg / $ file.json

Fügen Sie Assets / cfg zu Ihrer pubspec.yaml hinzu

Laden verschiedener Konfigurationsdateien beim Start der App:

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 {
  ...
}

Verwenden der Konfiguration in Ihrer App:

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"));
     }
}
Ephenodrom
quelle
0

Basierend auf der Bibliotheksidee hier eine Möglichkeit, einer Karte, die von anderen Widgets aufgerufen wird, "verschlüsselte" globale Variablen eines beliebigen Typs hinzuzufügen. Auf diese Weise müssen Sie solche Variablen nicht vorher deklarieren. Wenn eine Variable nicht vorhanden ist, wird sie von appDataSet zur Karte hinzugefügt. So können Sie in einem Widget wie einem Kontrollkästchen beispielsweise in der Funktion setState () Folgendes hinzufügen: appDataSet ('aCheckBox', Wert); Wenn aCheckBox nicht in der Map vorhanden ist, wird es hinzugefügt und der Wert mit value geladen (in diesem Fall ein Boolescher Wert).

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);
}
Chefzauberer
quelle
0

Sie müssen lediglich eine Datei wie "constatnts.dart" erstellen.

import '...materials.dart';

const Color baseColor = Color(0XFF353535);

und so verwenden

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


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

),

anonym
quelle