lib/base/safe_notifier_mixin.dart (44 lines of code) (raw):
// Copyright © 2025 Alibaba Cloud. All rights reserved.
//
// Author: keria
// Date: 2025/2/25
// Brief: 提供安全的通知和资源释放方法的混入类
import 'package:flutter/material.dart';
import 'package:aliplayer_widget/utils/log_util.dart';
/// A mixin that provides safe notification and disposal methods for ChangeNotifier.
///
/// 提供安全的通知和资源释放方法的混入类。
mixin SafeNotifierMixin on ChangeNotifier {
// Tag for logging purposes.
static const String _tag = "SafeNotifierMixin";
// Whether the notifier has been disposed.
bool _isDisposed = false;
/// Whether the notifier has been disposed.
///
/// 当前通知器是否已被释放。
bool get isDisposed => _isDisposed;
/// Check if the notifier is disposed and log a warning if it is.
///
/// 检查通知器是否已被释放,并在已释放时输出警告日志。
bool _checkDisposed() {
if (_isDisposed) {
// Log a warning message when attempting to interact with a disposed notifier.
logw("Attempted to interact with a disposed notifier.", tag: _tag);
}
return _isDisposed;
}
/// Check if the notifier has listeners and log a warning if it does.
///
/// 检查通知器是否有监听器。
@override
bool get hasListeners {
// Only return true if the notifier is not disposed and has listeners.
return !_checkDisposed() && super.hasListeners;
}
/// Safely notify listeners if the notifier is not disposed.
///
/// 如果通知器未被释放,则安全地通知监听器。
@override
void notifyListeners() {
if (!_checkDisposed()) {
super.notifyListeners();
}
}
/// Safely add a listener if the notifier is not disposed.
///
/// 如果通知器未被释放,则安全地添加监听器。
@override
void addListener(VoidCallback listener) {
if (!_checkDisposed()) {
super.addListener(listener);
}
}
/// Safely remove a listener if the notifier is not disposed.
///
/// 如果通知器未被释放,则安全地移除监听器。
@override
void removeListener(VoidCallback listener) {
if (!_checkDisposed()) {
super.removeListener(listener);
}
}
/// Mark the notifier as disposed and release resources.
///
/// 标记通知器为已释放并释放相关资源。
@override
void dispose() {
if (!_isDisposed) {
_isDisposed = true;
super.dispose();
} else {
logw("Attempted to dispose an already disposed notifier.", tag: _tag);
}
}
}