Skip to content

Let clearOverlays() clear strategy-driven markers too - #30

Open
wf9a5m75 wants to merge 1 commit into
developfrom
fix/clear-strategy
Open

wf9a5m75 wants to merge 1 commit into
developfrom
fix/clear-strategy

Conversation

@wf9a5m75

@wf9a5m75 wf9a5m75 commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

なぜ

clearOverlays() は、各プロバイダが自分で持つコントローラ(マーカー・ポリゴンなど)しか clear していませんでした。クラスタリングなどの拡張が登録する Strategy のコントローラ(StrategyMarkerController)は対象外で、clearOverlays() の後もクラスタのマーカーが地図に残っていました。

何を変えたか

  • MarkerRenderingSupport に clearMarkers() を足しました。接続中の Strategy が描いたものを clear します(StrategyMarkerController.clear(): onRemove → strategy.clear() → onPostProcess)。Strategy は接続したままです。
  • clear の後は、オーバーレイの collector と同じふるまいです。同じインスタンスが届き続けるあいだ(clearOverlays の直後に SwiftUI が body を評価し直す)は描かず、顔ぶれが変わるか作り直した state が届いたら全体を描き直します。スタイルの読み直し(flush)でも戻しません。
  • MapServiceRegistry.clearMarkerRendering() を足しました。登録されている support を引いて clearMarkers() を呼びます。各プロバイダの clearOverlays() はこれを 1 回呼びます(プロバイダ側の PR)。
  • MarkerRenderingClearTests を足しました。clearMarkers() が何もしないと落ちます。

ソース互換について(承認済み)

MarkerRenderingSupport.clearMarkers() は既定実装なしの必須要件にしています。既定の空実装にすると、独自の Strategy コントローラを持つ HERE や ArcGIS 3D のような準拠型で、コンパイルは通るのに何も消えない、という形になるためです。そのため、SDK の外で MarkerRenderingSupport に準拠している型はソース互換が壊れます(実装の追加が必要)。この点はユーザーの判断で承認済みです。

検証

2026-11-08 に develop(fix/mapview-teardown、fix/geodesic-polygon-fill、fix/clear-followups、refactor/polygon-controller などのマージ後)の上に載せ直してから確かめています。

  • ios-sdk-core の単体テスト 362 件すべて成功(MarkerRenderingClearTests を含む。clearMarkers() が何もしないと落ちることを確認済み)。api-surface は追加のみ。
  • 11 プロバイダとも、同じブランチの core と組み合わせて api-surface.sh check(BUILD_LIBRARY_FOR_DISTRIBUTION でのビルドを含む)が通りました。
  • 各プロバイダの clearOverlays() が strategy まで届く経路を、develop の teardown 後のコードで読み直しました(controller → clearOverlaysHandler(MapHost / Coordinator)→ 各コントローラの clear → clearMarkerRendering()。ArcGIS は 3D/2D の controller から、Longdo は OverlayBinding から、OMM は strategyManager.clearMarkers() を直接)。素通りする経路はありませんでした。
  • iPad 実機で、develop + この PR 一式 + fix/overlay-stacking-order を合わせたアプリを MapLibre / MapKit で動かし、clearOverlays の後に Strategy のマーカー(MarkerClusterGroup 経由)も消えることを確かめました。前回(載せ直す前)は全プロバイダで撮っています。

確認できていないもの

  • ios-for-googlemaps は、Package.swift の iOS 16 指定と GoogleMaps の要求(iOS 17)が合わない既存の問題で、そのままではビルドできません(develop でも同じ)。確認用のコピーだけ .iOS(.v17) にしてビルドと api を確かめました。
  • 載せ直した後の実機確認は MapLibre / MapKit のみです(develop が clearOverlays の経路を触っていないため)。
  • 既存の問題(この PR の範囲外): StrategyMarkerManager.clear()(disconnect)では、GL 以外のプロバイダでネイティブのマーカーが残ります。

関連 PR(fix/clear-strategy の一式)

マージの順番:

  1. 各プラットフォームの core(android-sdk-core / ios-sdk-core / js-sdk-core)
  2. そのプラットフォームのプロバイダ(core の新しい API を呼ぶので、core より先に入れるとビルドが通りません)
  • web はさらに js-sdk-core の npm 公開と、各 react-for-* の依存の引き上げが前提です(npm 公開はまだしない、という決定なので、web のプロバイダ PR はそれまで保留です)。
  • fix/overlay-stacking-order の PR 一式とは衝突しません(git merge-tree で確認済み)。順番は clear-strategy → stacking を想定しています。

clearOverlays() cleared each provider's own overlay controllers, but not
the StrategyMarkerController behind MarkerRenderingSupport (clustering
and other marker-rendering plugins), so clustered markers stayed on the
map.

MarkerRenderingSupport gains clearMarkers(): clear what the connected
strategy drew (StrategyMarkerController.clear(): onRemove ->
strategy.clear() -> onPostProcess), keeping the strategy connected.
After that it behaves like the overlay collectors after a clear: while
the same instances keep arriving (SwiftUI re-evaluates the body right
after clearOverlays()), nothing is drawn; once the membership changes
or a re-created state arrives, the whole list is drawn again. flush()
(style reload) does not bring them back either.

MapServiceRegistry.clearMarkerRendering() resolves the registered
support and calls it; every provider's clearOverlays() calls it once.

clearMarkers() is a protocol requirement with no default on purpose: a
default no-op would compile and silently do nothing for HERE and ArcGIS
3D, which keep their own strategy controller instead of
StrategyMarkerManager. Public API: additions only.

MarkerRenderingClearTests fails when clearMarkers() does nothing
(markers still drawn after clearMarkerRendering()) and passes now.
This was referenced Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant