Глобальные переменные в дротике

Я пытаюсь создать одностраничное приложение Dart.

Я создал первый пользовательский элемент (custom-application), который содержит все приложение. В нем есть контейнер, который используется для визуализации представлений. И боковой навигатор, который будет содержать информацию о пользователе и обновляться, когда пользователь входит в систему.

Я хочу поделиться информацией между мнениями. Как я могу определить глобальную переменную в custom-application и иметь возможность поделиться ею с другими представлениями?

Например, при запуске приложения вы не аутентифицированы. При вызове/входе в систему (login-view входа в login-view) у вас будет форма входа в систему. Я хочу, чтобы при входе в custom-application элемент custom-application сохранял информацию пользователя, загруженную в виде login-view в вложенное login-view и обновлял боковой навигатор.

Можно ли это сделать?

Ответ 1

Просто создайте файл библиотеки и создайте поля для глобальных таблиц, которые вам нужны. Импортируйте эту библиотеку везде, где вам нужен доступ к этим полям.

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;

Вы также можете
- создать одноэлемент в библиотеке глобалов (см. раздел " Как создать Singleton в Dart?" для получения более подробной информации).
- использовать наблюдаемый, чтобы получать уведомления об изменениях (см. Реализация шаблона Observer в Dart, Как я могу вызвать какое-то событие onChange в классе для получения более подробной информации)

Ответ 2

++++ Обновление за июль 2019 года ++++

Я написал пакет, в который интегрирована глобальная конфигурация Flutter.

EZ Flutter - это коллекция виджетов, пакетов и многих других полезных вещей, смешанных в небольшом фреймворке. Цель состоит в том, чтобы сделать стандартные функции доступными с нуля. EZ Flutter поддерживает управление различными файлами конфигурации, доступ к которым можно получить из приложения.

Github: 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.dart или main_prod.dart.

Я написал простой пакет флаттера, который имеет дело с разделением файлов конфигурации и загрузкой их при запуске приложения. Конфигурация будет доступна в каждой строке кода в вашем приложении.

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

Как это использовать:

Создайте файл json в assets/cfg/$ file.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 {
  ...
}

Использование конфигурации в вашем приложении:

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

Просто определите переменную для класса и на другой странице получите доступ к имени этой переменной.

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