Глобальні змінні в дарті


83

Я намагаюся створити односторінковий додаток Dart.

Я створив перший спеціальний елемент ( custom-application), який містить цілу програму. У ньому є контейнер, який використовується для візуалізації подань. І бічну навігаційну панель, яка буде містити інформацію про користувача та оновлюватиметься, коли користувач входить в систему.

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

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

Чи можна це зробити?

Відповіді:


170

Просто створіть файл бібліотеки та створіть там поля для потрібних вам глобалів. Імпортуйте цю бібліотеку скрізь, де вам потрібен доступ до цих полів.

app.dart

import 'globals.dart' as globals;

main() {
  globals.isLoggedIn = true;
}

компонент1.дарт

import 'globals.dart' as globals;

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

globals.dart

library my_prj.globals;

bool isLoggedIn = false;

Ви також можете


Це чудово працює. Дякую за це та всі посилання. Я збираюся перевірити.
T00rk,

3
Нарешті мені вдалося отримати глобальну змінну як спостережну, використовуючи спостережуваний шаблон. Це працює дуже добре. Дякую ще раз.
T00rk

2
На жаль, мої вибачення - мій коментар був трохи поза контекстом. Ні - з обмежених тестів, які я пробував, це, здається, не працює, коли доступ до глобальних даних здійснюється із зворотного виклику, який виконується обчисленням. Я поставлю це як належне запитання, коли знайду час.
мисливець

1
@ GünterZöchbauer що робить library my_prj.globalsу globals.dartфайлі?
Фадхіл

1
Це оголошення бібліотеки було обов'язковим у попередніх версіях Dart, але з часом стало необов'язковим, і я думаю, що його більше ніхто не використовує. Кожен файл Dart, який не є частиною, потребує унікальної декларації бібліотеки. Якщо його явно не додано, він походить від імені файлу + шляху.
Гюнтер Цехбауер

9

Ви можете створити клас

myColors.dart

class AppColors {

  static var primary = Colors.blue;
}

І імпортування вашого класу

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

І доступ за допомогою AppColors.primary


5

++++ Оновлення липня 2019 ++++

Я написав Пакет, який інтегрує Flutter Global Config.

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

Додайте активи / 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"));
     }
}

1

Все, що вам потрібно, це створити файл типу "constatnts.dart"

import '...materials.dart';

const Color baseColor = Color(0XFF353535);

і використовувати так

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


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

),


0

Виходячи з ідеї бібліотеки, тут можна додати "ключені" глобальні змінні будь-якого типу на карту, викликану з інших віджетів. Таким чином, вам не потрібно заздалегідь оголошувати такі змінні. Якщо змінної не існує, вона додається на карту appDataSet. Отже, у віджет, як прапорець, можна додати, наприклад, у функцію setState (): appDataSet ('aCheckBox', значення); Якщо aCheckBox не існує на карті, він додається і значення завантажується зі значенням (у цьому випадку булевим значенням).

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);
}

0

Я створив файл дротиків, який назвав my-globals.dart, де я можу визначити свої глобальні змінні.

Подобається це:

library globals;

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

Це весь файл дротиків.

А потім, у тому самому каталозі чи папці, я можу створити інші класи, де я можу отримати доступ до своїх глобалів, імпортуючи my-globals.dart як глобальні. Давайте створимо клас, який розширює StatefulWidget. Там ми збираємося змінити значення глобальної змінної з назвою globalInt, натискаючи кнопку Flat.

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);
         },
       ),
    );
  }
}

Розумієш. Я просто отримав доступ до змінної, яку хотів, написавши глобальні. а потім ім'я змінної, що міститься в бібліотеці.

Сподіваюся, цей приклад допоможе краще зрозуміти, як користуватися глобальною бібліотекою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.