Skip to content

Support hot-reload / hot-restart using vm service protocol #2708

Closed

Description

@fuzzybinary

The Dart VM Service protocol now supports hot reload and hot restart, meaning Dart command line apps should support proper code hot reloading. It would be nice if Dart-Code utilized this method instead of relying on the flutter tool.

Activity

  1. added this to the On Deck milestone on Aug 12, 2020
  2. added
    in dartRelates to running Dart programs
    is enhancementAn enhancement or improvement that should be listed in release notes but is not a bug fix.
    on Aug 12, 2020
  3. added 2 commits that reference this issue on Sep 27, 2021
    635dbfb
    09f524e
  4. modified the milestones: On Deck, v3.27.0 on Sep 27, 2021
  5. DanTup commented on Sep 27, 2021

    @DanTup
    Member

    @bkonyi should there be something like a reloadSources service/extension registered when running a Dart script? I can see the VM Service has a reloadServices method, but in Flutter we use the presence of reloadSources and hotRestart services to know when these are available. Should there be similar for Dart, or should we assume it's always available for a recent SDK?

    (Also, the original issue here mentions Restart too - but I don't see anything in the docs about that - is it also available through the Dart VM without Flutter?)

  6. reopened this on Sep 27, 2021
  7. modified the milestones: v3.27.0, v3.28.0 on Sep 29, 2021
  8. fuzzybinary commented on Sep 29, 2021

    @fuzzybinary
    Author

    I may have been mistaken about the ability to do Hot Restart without Flutter.

  9. DanTup commented on Sep 29, 2021

    @DanTup
    Member

    Ah, got it.

    It would be good to support Hot Reload still - but it'd be nice to do it consistently with Flutter (eg. we use the presence of some VM Service to know it's available, and call it via that service) so the extension doesn't need to have logic about when it may/may not be available.

  10. bkonyi commented on Sep 29, 2021

    @bkonyi

    Correct, the service protocol doesn't actually implement Hot Restart. That's solely a Flutter extension of the protocol. The VM service protocol does support reloadSources, which is the RPC to trigger a hot reload.

  11. DanTup commented on Sep 29, 2021

    @DanTup
    Member

    Ah, sounds like there does need to be two paths:

    • Dart: assume Hot Reload is always available, call reloadSources
    • Flutter: use the presence of the reloadSources Service to decide if it's available, and call that instead of reloadSources directly (I presume Flutter is doing something more than just calling the VM service)

    The second is all already there, the first would just be adding a new Dart: Hot Reload command that is visible only when running a non-Flutter app, that just calls reloadSources.

  12. DanTup commented on Oct 26, 2021

    @DanTup
    Member

    There's now an additional command Dart: Hot Reload which will call reloadSources for each isolate when debugging non-Flutter apps:

    Oct-26-2021 14-47-46

    Actually, Flutter: Hot Reload and Dart: Hot Reload call the same thing (so using either will have the same effect), it's the debug adapter that actually controls which code is run. For Flutter, we need to go through Flutter because otherwise I think some code to rebuild the widget tree could be skipped.

  13. fuzzybinary commented on Oct 26, 2021

    @fuzzybinary
    Author

    Does this work with reload on save or do you have to manually trigger the reload?

  14. DanTup commented on Oct 26, 2021

    @DanTup
    Member

    @fuzzybinary right now you have to run the command. I'm not sure I'd want to enable it by default, although perhaps we could add a dart.hotReloadOnSave (similar to dart.flutterHotReloadOnSave)? If that would be useful, please file an issue and I'll have a look at getting it into the next release.

    (btw there's a beta with the above command available at https://github.com/Dart-Code/Dart-Code/releases/tag/v3.28.0-beta.1 if you want to try it out before the release)

  15. DanTup commented on Oct 26, 2021

    @DanTup
    Member

    Actually, there's probably some inconsistency here.. If you run a Flutter app and a Dart app at the same time, saving a file probably will reload both, because it will unconditionally send the request to both. So if we were to support both, we should probably improve that too.

  16. DanTup commented on Oct 27, 2021

    @DanTup
    Member

    Supporting hot-reload-on-save properly turns out to be a bit trickier than I thought and will require some refactoring, so I'm going to leave that until the next release (I've filed #3637). In the meantime, I'm going to ensure the Dart reload is not fired by Flutter's reload-on-save, because it could be unreliable (for example it would not debounce if Flutter supports its own internal debounce, which would result in it triggering a lot when you do things like Save All).

  17. added a commit that references this issue on Oct 27, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    in dartRelates to running Dart programsis enhancementAn enhancement or improvement that should be listed in release notes but is not a bug fix.

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions