// Dart imports: import 'dart:async'; // Flutter imports: import 'package:flutter/widgets.dart'; /// /// Миксин для виджетов которые имеют подписки /// /// Автоматически отписывается в методе [dispose] /// mixin Subscriptionable on State { /// Массив подписок final List> subs = >[]; /// /// Метод получения списка подписок /// List> get subscribe { return >[]; } /// /// Обновление состояния экрана если он [mounted] /// @protected void setState_(VoidCallback? callback) { callback?.call(); if (mounted) { // ignore: no-empty-block setState(() {}); } } @override void initState() { subs.addAll(subscribe); super.initState(); } @override void dispose() { for (StreamSubscription sub in subs) { sub.cancel(); } super.dispose(); } } /// /// Миксин для подписки любых классов /// mixin WithSubscription on Object { /// Массив подписок final List> subs = >[]; /// /// Метод получения списка подписок /// List> get subscribe { return >[]; } /// /// Добавить все подписки из subscribe /// void subscribeAll() { subs.addAll(subscribe); } /// /// Отписаться от всех подписок /// void unsubscribe() { for (StreamSubscription sub in subs) { sub.cancel(); } } }