Добавить объявление

Как создать свое расширение для Dart DevTools

Привет! Наткнулся на статью, где автор подробно рассказывает, как добавить собственную вкладку в Dart DevTools и настроить взаимодействие с запущенным Flutter-приложением. Оказывается, это не так сложно, как кажется.

С чего начать:


Первым делом создается новый пакет под расширение. Официального шаблона нет, поэтому структуру добавляют вручную. В корне пакета создается папка devtools, внутри - build и файл конфигурации config.yaml. В конфиге указываются имя, версия, иконка для вкладки и трекер ошибок:

Файл config.yaml:

name: my_dev_tools_ext
issueTracker: https://...
version: 0.0.1
materialIconCodePoint: '0xe0b1'
requiresConnection: false

Для работы расширения нужен пакет 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 для управления жизненным циклом и избегать утечек.

evalasyncEval и evalInstance дают гибкие возможности, но есть нюансы: ограничен размер возвращаемых данных, код может быть недоступен из-за tree shaking, а к приватным полям просто так не обратиться.

Вывод:


Расширения DevTools открывают интересные возможности для создания инструментов отладки, визуализации состояния и даже управления приложением в рантайме. Статья дает хороший практический старт: от создания пакета до выполнения произвольного Dart-кода на живом приложении. Если вы когда-нибудь хотели добавить свою вкладку в DevTools - это вполне реально.
05.05.2026 35 409