85 lines
1.8 KiB
Dart
85 lines
1.8 KiB
Dart
// Dart imports:
|
|
import 'dart:async';
|
|
|
|
// Flutter imports:
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
///
|
|
/// Миксин для виджетов которые имеют подписки
|
|
///
|
|
/// Автоматически отписывается в методе [dispose]
|
|
///
|
|
mixin Subscriptionable<T extends StatefulWidget> on State<T> {
|
|
/// Массив подписок
|
|
final List<StreamSubscription<dynamic>> subs =
|
|
<StreamSubscription<dynamic>>[];
|
|
|
|
///
|
|
/// Метод получения списка подписок
|
|
///
|
|
List<StreamSubscription<dynamic>> get subscribe {
|
|
return <StreamSubscription<dynamic>>[];
|
|
}
|
|
|
|
///
|
|
/// Обновление состояния экрана если он [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<dynamic> sub in subs) {
|
|
sub.cancel();
|
|
}
|
|
|
|
super.dispose();
|
|
}
|
|
}
|
|
|
|
///
|
|
/// Миксин для подписки любых классов
|
|
///
|
|
mixin WithSubscription on Object {
|
|
/// Массив подписок
|
|
final List<StreamSubscription<dynamic>> subs =
|
|
<StreamSubscription<dynamic>>[];
|
|
|
|
///
|
|
/// Метод получения списка подписок
|
|
///
|
|
List<StreamSubscription<dynamic>> get subscribe {
|
|
return <StreamSubscription<dynamic>>[];
|
|
}
|
|
|
|
///
|
|
/// Добавить все подписки из subscribe
|
|
///
|
|
void subscribeAll() {
|
|
subs.addAll(subscribe);
|
|
}
|
|
|
|
///
|
|
/// Отписаться от всех подписок
|
|
///
|
|
void unsubscribe() {
|
|
for (StreamSubscription<dynamic> sub in subs) {
|
|
sub.cancel();
|
|
}
|
|
}
|
|
}
|