Flutter Pulse
420 subscribers
276 photos
557 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Делегирование дизайна виджета
Привет, Flutter-разработчики! 👋 Сегодня мы рассмотрим полезный паттерн проектирования - делегирование дизайна виджета с использованием широко известного паттерна builder. 📈

Когда это полезно? 🤔
Вы создаете виджет списка радиокнопок или чекбоксов, например. И вы не хотите предоставлять дизайн каждого элемента списка. В таком случае вы создаете Item builder, который будет делегировать создание дочерних элементов. 📝



// Определяем тип OptionBuilder для построения элемента из ключа и состояния выбранности
typedef OptionBuilder = Widget Function(String key, bool selected);

// Определяем тип OnValidate для функции валидации
typedef OnValidate = void Function(String? key);

class RadioQuestion extends ConsumerStatefulWidget {
// ...
final OptionBuilder optionBuilder; // Делегируем построение элемента списка
final OnOptionIdSelected? onOptionIdSelected;
final OnValidate? onValidate;

const RadioQuestion({
super.key,
required this.optionBuilder,
this.onOptionIdSelected,
this.onValidate,
// ...
});

@override
ConsumerState<RadioQuestion> createState() => _RadioQuestionState();
}

class _RadioQuestionState extends State<RadioQuestion> {
int? _selectedIndex;

@override
void initState() {
_selectedIndex = widget.initialSelectedIndex;
super.initState();
}

@override
Widget build(BuildContext context) {
return List.generate(
widget.itemCount,
(index) => widget.optionBuilder(widget.keys[index], _selectedIndex == index),
);
}
}



В этом примере мы используем OptionBuilder для делегирования построения элементов списка. Это позволяет нам создать гибкий и переиспользуемый виджет. 🔄

Оцените новую рубрику и напишите в комментариях, что вы думаете о ней! 💬 Все подобные новости можно найти по хэштегу #FlutterPulseTips. 👀

#flutter #dart #flutterpulse #FlutterPulseTips #refactoring #widgetdesign #builderpattern #mobiledevelopment #codingtips
Заменить код типа на объединенный тип
Удаление кода типа из вашего класса с помощью объединенного типа

Представьте, что у вас есть класс, который ведёт себя по-разному в зависимости от своего состояния. Вместо того, чтобы использовать перечисления (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