Видимость приватных переменных во Flutter
ВАЖНО! видимость приватной переменной другая (нежели чем в других языках: php, c++, java.
В dart к приватной переменной можно обратиться и из другого класса, важно, чтобы обращение было в рамках одного файла! Т.е. видимость приватного объекта ограничивается не текущим классом, а текущим файлом!
А вот к приватной переменной, которая расположена в другом файле – обратиться нельзя!
Пример.
//импортируемый файл libraray.dart
class A {
int _private = 0;
int public = 0;
testA() {
print('int value: $_private'); // 0
_private = 5;
print('int value: $_private'); // 5
}
}
///////////////////////////////////
//исполняемый файл
import 'libraray.dart';
void main() {
A().public; // Объект public класса А доступен!
//A()._private; //Объект _private класса А не доступен! (он в другом файле)
C()._private; // доступен, т.к. в текущем файле
print('String value: ${B()._private}'); // HelloB. Доступен private метод класса В! (он в текущем файле)
B().testB();
}
class B extends A {
String _private = 'HelloB';
void testB() {
print('String value: $_private'); // HelloB
testA();
print('String value: $_private'); // HelloB
}
}
class C {
String _private = 'HelloC';
}
P.S.
Я хотел найти этому (что видимость приватного объекта в рамках одного файла) подтверждение в официальной документации, и там нашел следующее:
Unlike Java, Dart doesn’t have the keywords public, protected, and private. If an identifier starts with an underscore (_), it’s private to its library. For details, see Libraries and visibility. Every Dart app is a library, even if it doesn’t use a library
directive.
В отличие от Java, в Dart нет “ключевых слов” public, protected и private. Если идентификатор начинается с подчеркивания (_), он является приватным для своей библиотеки. Каждое приложение Dart – это библиотека, даже если оно не использует директиву библиотеки.
Насколько я понял, в данном случае под библиотекой как раз и подразумевается файл с нашим кодом.