Skip to content

Instantly share code, notes, and snippets.

@PlugFox
Last active October 21, 2025 13:03
Show Gist options
  • Select an option

  • Save PlugFox/8ed1f4765e617d317a15a1a452abd928 to your computer and use it in GitHub Desktop.

Select an option

Save PlugFox/8ed1f4765e617d317a15a1a452abd928 to your computer and use it in GitHub Desktop.
Dart disposable
void Function() dispose = () {dispose = () {};};
void disposable(void Function() fn) {
final $ = dispose;
dispose = () {
try {
fn();
} finally {
$();
}
};
}
/*
Собственно как не обосраться и высвободить все ресурсы
Даже если в процессе диспоза пойдет что то не так
И сохраняя порядок высвобождения (в 99,9% случаев то что было инициализировано первым, должно диспозиться последним)
Если будешь пользовать часто, можешь вынести в миксин
Асинхронный вариант выглядит также
BTW, то что написал код выше - дан просто для примера, как упрощенная версия
к примеру старайтесь никогда не писать
```dart
try { } finally { }
```
без `on Object` блока в Dart
это ведет себя через жопу
также для асинхронной версии я указываю таймауты
есть коллбэк или логи для ошибок и всякое такое
опционально в коллбэк можете передавать мьютекс, если часть синхронных операций диспоза независимы, а часть нуждается в последовательном асинхронном диспозе
*/
void main() {
// Init
print('setUp');
{
var controller = 'a';
disposable(() => print('- $controller'));
print('+ $controller');
}
{
var controller = 'b';
disposable(() => print('- $controller'));
print('+ $controller');
}
{
var controller = 'c';
disposable(() => print('- $controller'));
print('+ $controller');
}
// Dispose
print('tearDown');
dispose();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment