Привет! Наткнулся на , где автор подробно рассказывает, как добавить собственную вкладку в Dart DevTools и настроить взаимодействие с запущенным Flutter-приложением. Оказывается, это не так сложно, как кажется.
С чего начать:
Первым делом создается новый пакет под расширение. Официального шаблона нет, поэтому структуру добавляют вручную. В корне пакета создается папка devtools, внутри - build и файл конфигурации config.yaml. В конфиге указываются имя, версия, иконка для вкладки и трекер ошибок:
Для работы расширения нужен пакет devtools_extensions. Он дает доступ к менеджерам: extensionManager (взаимодействие с DevTools), serviceManager (доступ к VM-сервису) и dtdManager (связь с Dart Tooling Daemon).
Интерфейс и тестирование:
Сами виджеты можно собирать из готовых компонентов пакета devtools_app_shared. Например DevToolsButton уже имеет стиль, подходящий для интерфейса DevTools, а через extensionManager.showNotification можно показывать уведомления.
Для отладки расширения используется симулированная среда:
flutter run -d chrome --dart-define=use_simulated_environment=true
Перед публикацией сборка создается командой build_and_copy, а проверить корректность структуры можно через validate.
Два типа расширений:
Standalone extensions - отдельные пакеты, не привязанные к существующему pub-пакету. Подходят для инструментов, которые могут пригодиться в любом проекте.
Companion extensions - поставляются вместе с существующим pub-пакетом. Когда пользователь подключает такой пакет, расширение автоматически появляется в DevTools. Для этого в корне пакета достаточно добавить папку extension/devtools со сборкой и конфигом.
Как взаимодействовать с приложением:
Самое интересное - через EvalOnDartLibrary из пакета devtools_app_shared. С его помощью можно:
Асинхронно выполнять Dart-код в рантайме приложения.
Вызывать методы объектов.
Читать значения полей.
Получать ссылки на экземпляры и работать с ними дальше.
Инициализация требует доступа к VmService (через serviceManager.onServiceAvailable). Важно использовать Disposable для управления жизненным циклом и избегать утечек.
eval, asyncEval и evalInstance дают гибкие возможности, но есть нюансы: ограничен размер возвращаемых данных, код может быть недоступен из-за tree shaking, а к приватным полям просто так не обратиться.
Вывод:
Расширения DevTools открывают интересные возможности для создания инструментов отладки, визуализации состояния и даже управления приложением в рантайме. Статья дает хороший практический старт: от создания пакета до выполнения произвольного Dart-кода на живом приложении. Если вы когда-нибудь хотели добавить свою вкладку в DevTools - это вполне реально.