Last active
October 21, 2025 13:03
-
-
Save PlugFox/8ed1f4765e617d317a15a1a452abd928 to your computer and use it in GitHub Desktop.
Dart disposable
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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