Flutter Pulse
524 subscribers
348 photos
766 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Заменить код типа на объединенный тип
Удаление кода типа из вашего класса с помощью объединенного типа

Представьте, что у вас есть класс, который ведёт себя по-разному в зависимости от своего состояния. Вместо того, чтобы использовать перечисления (enum) и конструкции switch для определения поведения, вы можете использовать новую возможность Dart 3 — sealed классы. Это делает код чище, безопаснее и проще в поддержке.

Было:

enum DocumentType {
pdf,
doc,
markdown,
}

class Document {
final String name;
final DocumentType type;

Document({
required this.name,
required this.type,
});

void write(String newLine) {
switch (type) {
case DocumentType.pdf:
// предположим, что у нас есть библиотека для pdf
break;
case DocumentType.doc:
// предположим, что у нас есть библиотека для doc
break;
case DocumentType.markdown:
// предположим, что у нас есть библиотека для markdown
break;
}
}
}


Стало:

sealed class DocumentSealed {
final String name;

DocumentSealed({required this.name});
}

class PdfDocument extends DocumentSealed {
PdfDocument({required super.name});

void write(String newLine) {
// используем библиотеку для pdf
}
}

class DocDocument extends DocumentSealed {
DocDocument({required super.name});

void write(String newLine) {
// используем библиотеку для doc
}
}

class MarkdownDocument extends DocumentSealed {
MarkdownDocument({required super.name});

void write(String newLine) {
// используем библиотеку для markdown
}
}


Использование:

class Widget extends StatelessWidget {
final DocumentSealed document;

const Widget({super.key, required this.document});

@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
switch (document) {
case PdfDocument _:
document.write('Hello World');
case DocDocument _:
document.write('Hello World');
case MarkdownDocument _:
document.write('Hello World');
}
},
child: Text(document.name),
);
}
}


Преимущества:
• Инкапсуляция кода типа в отдельные классы
• Для каждого типа создается свой подкласс
• Разная логика для разных типов без использования switch
• Код становится более читаемым и тестируемым

Оцените новую рубрику! 💡📱 Ваши отзывы нам очень важны! 😊

Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #Refactoring #CodingTips #SoftwareDevelopment #ProgrammingTips
Тестирование выбрасывания ошибки
Привет, Flutter-разработчики! 🤖💻
Сегодня мы рассмотрим полезный совет по тестированию в Flutter: как проверить, что ваше приложение выбрасывает конкретную ошибку. Это очень важно для обеспечения стабильности и надежности вашего приложения. 📈

Вы когда-нибудь сталкивались с ситуацией, когда ваш код выбрасывает ошибку, и вы не знали, как ее правильно протестировать? 🤔 Теперь у вас есть решение! Мы будем использовать `testWidgets` для проверки того, что виджет выбрасывает ожидаемую ошибку.

Пример кода:


testWidgets('создание виджета с некоторым параметром → throw', (WidgetTester tester) async {
var exceptionRes;
// catch flutter error или это приведет к провалу теста
FlutterError.onError = (details) {
exceptionRes = details.exception;
};
await tester.pumpWidget(myAppWithError);
// вернуть обработчик ошибок Flutter обратно
// Flutter выбросит ошибку, если этого не сделать
FlutterError.onError = (details) => FlutterError.presentError(details);
expect(exceptionRes, isNotNull);
expect(exceptionRes, isInstanceOf<MyCustomException>());
});



В этом примере мы тестируем, что виджет выбрасывает `MyCustomException`, когда ему передаются определенные параметры. Мы используем `FlutterError.onError` для перехвата исключения и его проверки.

Оцените нашу новую рубрику и напишите в комментариях, какие темы вы хотели бы видеть в будущем! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips. 🔍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #SoftwareDevelopment #ErrorHandling #Testing