web-dev-qa-db-fra.com

Variables globales dans une fléchette

J'essaie de créer une application Dart d'une seule page.

J'ai créé un premier élément personnalisé (custom-application) qui contient l'ensemble de l'application . Il contient un conteneur utilisé pour le rendu des vues. Et un navigateur latéral qui contiendra les informations de l'utilisateur et sera mis à jour lorsque l'utilisateur sera connecté.

Je souhaite partager des informations entre des vues. Comment puis-je définir une variable globale dans custom-application et pouvoir la partager avec les autres vues?

Par exemple, lorsque vous démarrez l'application, vous n'êtes pas authentifié. Lorsque vous appelez/connectez-vous (login-view), vous obtenez un formulaire de connexion. Je veux, lorsque vous vous connectez à l'application, l'élément custom-application stocke les informations de l'utilisateur chargées par la vue imbriquée login-view et met à jour le navigateur latéral.

Est-il possible de le faire?

25
T00rk

Créez simplement un fichier de bibliothèque et créez des champs pour les éléments globaux dont vous avez besoin. Importez cette bibliothèque partout où vous avez besoin d'accéder à ces champs.

app.Dart

import 'globals.Dart' as globals;

main() {
  globals.isLoggedIn = true;
}

composant1.Dart

import 'globals.Dart' as globals;

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

globals.Dart

library my_prj.globals;

bool isLoggedIn = false;

Vous pouvez également
- créer un singleton dans la bibliothèque globals (voir Comment construire un singleton dans Dart? pour plus de détails).
- utilise observable pour être averti des modifications (voir Implémenter un motif Observer dans Dart , Comment puis-je déclencher une sorte d'événement onChange dans une classe pour plus de détails)

41
Günter Zöchbauer

J'ai eu le même problème avec les variables globales. Par conséquent, j’avais également besoin d’une configuration différente pour chaque version de l’application (dev/prod) et je ne souhaite pas écrire la configuration dans le fichier main_dev.Dart ou dans le fichier main_prod.Dart.

J'ai écrit un paquetage simple qui traite de la séparation des fichiers de configuration et de leur chargement au démarrage de l'application. La configuration est alors disponible sur chaque ligne de code de votre application.

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

Comment l'utiliser :

Créez un fichier json sous assets/cfg/$ file.json

Ajouter assets/cfg à votre pubspec.yaml

Chargement de différents fichiers de configuration au démarrage de l'application:

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

Utilisation de la configuration dans votre application:

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
inf3ction