#flutter #dart #intellij-idea #dart-analyzer
#flutter #dart #intellij-idea #dart-анализатор
Вопрос:
Существует ли стандартный Dart-способ убедиться, что все поля класса присутствуют в списке параметров конструктора?
Очень упрощенный пример:
class Message{
String header;
String body;
DateTime sentAt;
Message(this.header, this.body, this.sentAt);
Message makeCopy(){
return Message(header, body, sentAt);
}
}
Теперь приходит коллега и добавляет поле String category
, но забывает добавить его в конструктор — и, что еще хуже, в конструктор копирования. Есть ли способ заставить IDE (IntelliJ) выдавать предупреждение или ошибку об этом отсутствующем новом поле?
Я думаю о чем-то похожем на предупреждение, выдаваемое при пропуске значения enum из switch
-инструкции.
Или есть хотя бы какой-то способ заставить IntelliJ выдавать такое предупреждение?
Комментарии:
1. Вероятно, возможно с помощью pub.dev/packages/pedantic
Ответ №1:
Вы получите предупреждения или ошибки, если вы создадите свои поля final
, из вашего класса кажется, что это было бы хорошей идеей в любом случае.
Теперь … конечно, это только переводит эту проблему в «как мне убедиться, что мой коллега также делает все новые поля окончательными».
Для этого вы можете объявить свой класс @immutable
, и тогда анализаторы смогут предупредить вас.
Анализаторы:
- pub.dev/пакеты/педантичный
- pub.dev/пакеты/effective_dart
Возможное объявление класса:
import 'package:meta/meta.dart';
@immutable
class Message {
final String header;
final String body;
final DateTime sentAt;
const Message(this.header, this.body, this.sentAt);
Message makeCopy() {
return Message(header, body, sentAt);
}
}
Попробуйте добавить новое поле или удалить одно из конструктора, вы получите ошибки.
Ответ №2:
Есть только один способ, но в большинстве случаев это правильный путь.
Вы создаете все поля final
и применяете неизменяемость, что приведет к ошибке компилятора, если поле не инициализировано в конструкторе.
Вы можете использовать dartanalyzer для обеспечения соблюдения следующих правил или, по крайней мере, генерирования предупреждений. https://dart-lang.github.io/linter/lints/prefer_final_fields.html
https://dart-lang.github.io/linter/lints/prefer_const_declarations.html
Чтобы упростить работу с dartanalyzer, вы можете взглянуть на пакет pedantic или на мой предпочтительный lint.