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