Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое Null в Dart
Null — это специальное значение, которое указывает на отсутствие значения или неинициализированное состояние переменной. В Dart это фундаментальная концепция, особенно с введением null safety в Dart 2.12.
Основные концепции
Nullable и Non-nullable типы
Dart 3.x требует явного указания, может ли переменная быть null:
// Non-nullable — не может быть null
String name = "John";
int age = 25;
// Nullable — может быть null (знак "?")
String? description;
int? optionalAge;
// По умолчанию переменные non-nullable
String email = null; // Ошибка компиляции!
String? email = null; // OK
Null Safety (Безопасность от null)
Это система типов, которая помогает избежать NullPointerException (NPE) на этапе компиляции:
String? getUserName() {
return null;
}
void printName() {
String? name = getUserName();
// Ошибка! Не можешь использовать nullable значение как non-nullable
// print(name.length);
// Нужна проверка
if (name != null) {
print(name.length); // Теперь OK
}
}
Работа с Null значениями
Null-coalescing operator (??)
Предоставляет дефолтное значение, если переменная null:
String? nickname;
String displayName = nickname ?? "Anonymous";
// Если nickname == null, displayName = "Anonymous"
Null-coalescing assignment operator (??=)
Присваивает значение только если переменная null:
String? nickname;
nickname ??= "Guest"; // nickname = "Guest" если была null
Conditional access (?.)
Безопасный доступ к свойствам nullable объектов:
class User {
String? email;
}
User? user;
String? emailLength = user?.email?.length.toString();
// Если user или email == null, результат будет null
Force unwrap (!)
Принудительное преобразование nullable в non-nullable:
String? name = "John";
String nonNullName = name!; // OK если name не null
String? empty;
String forced = empty!; // Runtime Error
Практические примеры
Безопасная работа с API ответами
Future<User?> fetchUser(String id) async {
try {
final response = await http.get(Uri.parse('/users/$id'));
if (response.statusCode == 200) {
return User.fromJson(jsonDecode(response.body));
}
} catch (e) {
print("Error: $e");
}
return null;
}
Optional widget rendering
class UserProfile extends StatelessWidget {
final String? bio;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text("Profile"),
if (bio != null) Text(bio!),
],
);
}
}
Late переменные
Для переменных, которые будут инициализированы позже:
late String largeData;
void initialize() {
largeData = "Heavy computation result";
}
Итого
Null Safety в Dart — это мощный инструмент для написания надёжного кода. Правильное использование nullable/non-nullable типов предотвращает ошибки на этапе разработки.