Migreer screen_retriever + window_manager naar nativeapi-flutter (uitfasering aangekondigd) #1741
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1741
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Achtergrond
Beide packages van uitgever leanflutter.dev hebben een migratie-melding op pub.dev staan:
De nieuwe versie is gebaseerd op een verenigde C++ kernbibliotheek (
libnativeapi/nativeapi) die meer complete en consistente cross-platform native API-ondersteuning biedt.De packages zijn nog actief (laatste updates 49 dagen geleden), maar de uitgever heeft aangekondigd dat de toekomst bij
nativeapi-flutterligt. Dit is een uitfaseringstraject.Huidige situatie
screen_retriever(^0.2.0)third_party/screen_retriever_macos(viadependency_overrides)window_manager(^0.5.1)screen_retrieverGebruik in OciDeck
screen_retrieverwordt gebruikt in de presenter mode voor het bepalen van schermgrenzen en display-informatie.window_managerwordt gebruikt voor window-geometry, fullscreen mode en de title bar.Beide packages raken de kern van de presentatie-ervaring op desktop (macOS, Linux, Windows).
Het alternatieft:
nativeapi-flutterlibnativeapi/nativeapi-flutteris de officiële opvolger:screen_retrieveralswindow_managerWat dit issue moet uitzoeken
nativeapi-flutteral productie-rijp? Het is mogelijk nog in ontwikkeling.screen_retriever_macosfork (window-geometry, fullscreen methods)?Aanpak
nativeapi-flutterAPI en feature-pariteitscreen_retriever+window_managerAPI-gebruikPrioriteit
Niet urgent — de packages werken nog en krijgen nog updates. Maar de uitgever heeft de migratierichting aangekondigd, dus dit is technical debt die aangepakt moet worden voordat de packages stoppen met updates.
Welke licentie hoort hierbij?
Licentie- en taalonderzoek
Huidige packages
Daarnaast hebben we een vendored fork in
third_party/screen_retriever_macosdie extra macOS-methods toevoegt.Voorgestelde vervanging: nativeapi
Belangrijk: het pakket heet op pub.dev
nativeapi(nietnativeapi-flutter— dat is de GitHub repo-naam).Conclusie
Alle packages gebruiken MIT. De architectuur verschchuift van aparte platform-specifieke implementaties naar een verenigde C++ kernbibliotheek met Dart-erboven. De taalmix wordt breder (C++ kern + Objective-C++ voor Apple-platformen + Kotlin voor toekomstige Android-ondersteuning), maar dat is transparent voor onze Dart-code.
Let op:
nativeapistaat nog in ontwikkeling ("work in progress"). De migratie is pas mogelijk als het pakket productie-rijp is en dezelfde macOS-methods dekt als onze vendored fork.Antwoorden op de vier vragen
1. Is
nativeapial productie-rijp?Nee. Het pakket staat expliciet op 0.1.4 en de README zegt: "🚧 Work in Progress: This package is currently under active development". Er zijn pas 6 versies gepubliceerd (0.0.1 t/m 0.1.4), geen 1.0.0, en de documentatie is incompleet ("More detailed documentation and examples are coming soon").
Conclusie: niet geschikt voor productie-gebruik. De migratie kan pas overwogen worden als er een stabiele 1.0.0 release is met volledige documentatie.
2. Biedt het dezelfde functionaliteit als onze vendored
screen_retriever_macosfork?Belangrijke correctie op het issue: de vendored fork in
third_party/screen_retriever_macosvoegt geen window-geometry of fullscreen methods toe. De fork bestaat uitsluitend om een SPM-bouwbaarheidsprobleem op te lossen — upstream 0.2.0 had alleen een CocoaPodsClasses/-layout, terwijl recente Xcode/SPM eenSources/<target>/-layout verwacht. ZieMODIFICATIONS.mdin de fork: er zijn twee bestanden toegevoegd (Package.swift + een SPM-layout kopie van de plugin source), verder is alles byte-identiek aan upstream.De window-geometry methods (
getBounds,setBounds) en fullscreen methods (setFullScreen) die we gebruiken zitten inwindow_manager, niet inscreen_retriever.Wat
nativeapibetreft:DisplayManager.getAll(), cursor position, display infogetBounds/setBounds): ✅ gedekt in de C++ kern, cross-platformsetFullScreen): ❓ onduidelijk — niet expliciet gedocumenteerd in de Flutter API. Er is een GitHub issue (#13) over fullscreen-gedrag met titleBarStyle, maar geen duidelijkesetFullScreen-equivalent in de Flutter bindings3. Hoeveel call-sites moeten aangepast worden?
screen_retriever— 2 call-sites:lib/widgets/presentation/fullscreen_presenter.dart(regel 258):screenRetriever.getAllDisplays()lib/widgets/presentation/parts/presenter_displays.dart(regel 8):screenRetriever.getAllDisplays()Beide gebruiken alleen
getAllDisplays(). GeengetPrimaryDisplayofgetCursorScreenPointin onze code.window_manager— 7 call-sites in 4 bestanden:lib/platform/native_window_io.dart:ensureInitialized(),waitUntilReadyToShow(),show(),focus(),setPreventClose(),destroy()lib/platform/presenter_fullscreen_io.dart:setFullScreen()lib/widgets/presentation/parts/presenter_displays.dart:getBounds(),setFullScreen(),setBounds()lib/widgets/app_shell.dart:addListener(),removeListener(),destroy()Totaal: 9 call-sites in 5 bestanden. Beperkt en overzichtelijk.
4. Kan de vendored fork verwijderd worden na migratie?
Ja, maar onafhankelijk van de nativeapi-migratie. De fork bestaat alleen voor SPM-bouwbaarheid. Upstream
screen_retriever_macosheeft sinds 0.2.1+ zelf SPM-support gekregen (zoals vermeld in deMODIFICATIONS.md: "Upstream has since gained SPM support of its own (0.2.1+). When this fork is bumped, check whether it can be dropped entirely.").De fork kan verwijderd worden door
screen_retrieverte bumpen naar 0.2.1+ en dedependency_overridesuit pubspec.yaml te halen — zodra geverifieerd is dat de upstream SPM-build werkt. Dat is een aparte, kleine opruimactie die niet opnativeapihoeft te wachten.Samenvatting en aanbeveling
Aanbeveling:
screen_retriever_macosfork doorscreen_retrieverte bumpen naar 0.2.2 (heeft SPM-support). Dat is een kleine opruimactie die de technical debt direct vermindert.nativeapiin de gaten. Migreer pas als er een 1.0.0 release is met fullscreen-ondersteuning gedocumenteerd. Dit issue open houden als tracking-issue.screen_retriever+window_managerpackages werken en krijgen nog updates. Geen urgentie.Testplan, definitie van 'goed genoeg', en wat bij problemen
Na bestudering van de daadwerkelijke
nativeapi0.1.4 Dart-API (uit de pub-cache) is hier de concrete mapping van onze 9 call-sites naar nativeapi-equivalenten, met de gaten expliciet benoemd.API-mapping: wat we nodig hebben vs. wat nativeapi biedt
screenRetriever.getAllDisplays()DisplayManager.instance.getAll()List<Display>metposition,size,scaleFactordisplay.visiblePosition/visibleSizedisplay.position/display.sizeofdisplay.workAreavisiblePosition/visibleSize(die rekenen de menubar/taskbar weg).workAreais mogelijk het equivalent — moet getest worden.windowManager.ensureInitialized()windowManager.waitUntilReadyToShow(options)window.title = ...,window.setMinimumSize()windowManager.show()window.show()windowManager.focus()window.focus()windowManager.setFullScreen(bool)window.isFullscreen = boolwindowManager.getBounds()window.boundswindowManager.setBounds(Rect)window.bounds = RectwindowManager.destroy()WindowManager.instance.shutdown()windowManager.addListener(this)/removeListenerWindowManager.instance.addListener<WindowFocusedEvent>(cb)windowManager.setPreventClose(true)onWindowClosecallbackWindowClosedEventDe twee kritieke gaten
1.
setPreventClose— ontbreekt volledigOnze
unsaved-work guardwerkt zo:windowManager.setPreventClose(true)onderschept de sluit-knop,onWindowClosevuurt, we vragen de gebruiker "opslaan?", en pas daarnadestroy(). Zonder dit kan een gebruiker het venster sluiten met niet-opgeslagen werk zonder waarschuwing.nativeapi heeft
isClosable(schakelt de sluit-knop uit) enWindowClosedEvent(vuurt na sluiten) — geen van beide is een interceptor. Er is wel eensetWillShowHook/setWillHideHookpattern inWindowManager— dat bewijst dat de architectuur voor pre-event hooks bestaat. EensetWillCloseHookzou hetzelfde pattern volgen.2.
Display.visiblePosition/visibleSize— mogelijk gedekt doorworkAreaOnze presenter-mode code gebruikt
display.visiblePosition ?? Offset.zeroendisplay.visibleSize ?? d.sizeom de positie van een scherm te bepalen, exclusief menubar/taskbar. nativeapi'sDisplayheeftposition(ruwe positie),size(ruwe grootte) enworkArea(Rect exclusief menubar/taskbar).workAreais waarschijnlijk het juiste equivalent, maar moet getest worden.Hoe de test eruitziet
Een spike (proof-of-concept) op een throwaway branch, niet een volledige migratie. Het doel is de 6 kritieke paden verifiëren op echt platform, niet de hele app overzetten.
Test-opzet
spike/nativeapi-1741(wordt niet gemerged)nativeapi: ^0.1.4toe aan pubspec.yamllib/platform/presenter_fullscreen_io.dart—window_managerdoornativeapi:lib/widgets/presentation/parts/presenter_displays.dartdegetAllDisplays()+getBounds()+setBounds()callsflutter run -d macosDe 6 te testen paden
getAll()retourneert juiste aantal schermen met juiste posities/groottesgetBounds()→setBounds(Rect)cyclusDefinitie van 'goed genoeg'
De spike is 'goed genoeg' om te migreren als alle 6 paden werken op macOS (ons primaire platform) en paden 1-4 ook op Windows en Linux. Specifiek:
getAll()retourneert dezelfde schermen alsscreen_retriever.getAllDisplays(), met posities die overeenkomen (eventueel viaworkAreai.p.v.visiblePosition)window.isFullscreen = true/falsewerkt identiek aanwindowManager.setFullScreen()— menubar verdwijnt, venster vult schermwindow.boundslezen/schrijven werkt identiekExtra voorwaarden:
Wat bij problemen — en kun je zelf een PR aanleveren?
Ja, absoluut. De repo is MIT-gelicentieerd, actief in ontwikkeling, en de onderhouder (LiJianying) is dezelfde persoon die
screen_retrieverenwindow_managermaakte — hij heeft er alle belang bij dat de migratie lukt.setPreventCloseontbreektsetWillCloseHooktoe aanWindowManager, volgens hetzelfde pattern als de bestaandesetWillShowHook/setWillHideHook. De C++ kern moet eennative_window_manager_set_will_close_hooktoevoegen. Op macOS:windowWillClosedelegate; op Windows:WM_CLOSEhandler; op Linux:delete-eventsignal.visiblePosition/visibleSizeontbrekenworkArea(Rect exclusief menubar/taskbar). Als dat niet voldoet: PR omvisiblePosition/visibleSizeaanDisplaytoe te voegen.workAreabestaat al, waarschijnlijk voldoende.destroy()per-venster ontbreektWindow.close()ofWindowManager.destroy(int id)toe. Op macOS:[window close]; op Windows:DestroyWindow; op Linux:gtk_widget_destroy.waitUntilReadyToShowontbreektsetTitle,setMinimumSize) vóórshow(). Geen PR nodig.nativeapi: 0.1.4) i.p.v.^0.1.4. Wacht met migreren tot 1.0.0 als de API te instabiel is.Aanbevolen volgorde
screen_retriever_macosfork (aparte kleine PR — bumpscreen_retrievernaar 0.2.2, haaldependency_overridesweg). Dat is los van nativeapi en vermindert direct technical debt.libnativeapi/nativeapi-flutteromsetWillCloseHooktoe te voegen langs het bestaande hook-pattern. Wacht tot die gemerged is voordat de migratie doorgaat.Conclusie
De spike is nodig en haalbaar. Het belangrijkste onbekende is
setPreventClose— dat is een harde eis voor onzeunsaved-work guarden het ontbreekt volledig in nativeapi. Maar de architectuur voor pre-event hooks bestaat al (setWillShowHook/setWillHideHook), dus een PR omsetWillCloseHooktoe te voegen is haalbaar langs een bewezen pad. De overige gaten (visiblePosition,destroy) zijn waarschijnlijk oplosbaar metworkAreaen een kleine PR.Megaplan: stap-voor-stap migratie naar nativeapi
Beleid: we doen het stap voor stap en leveren PR's aan de upstream maintainer (LiJianying) om nativeapi verder te helpen. Hieronder het volledige plan in 6 fasen.
Fase 0: Verwijder vendored screen_retriever_macos fork
Onafhankelijk van nativeapi — direct uitvoerbaar.
De vendored fork in
third_party/screen_retriever_macosbestaat alleen voor SPM-bouwbaarheid. Upstreamscreen_retriever0.2.2 heeft zelf SPM-support.screen_retrievernaar^0.2.2dependency_overridesen dethird_party/screen_retriever_macos/mapflutter build macosmet SPMmake checkgroen, beeldkeuring macOSFase 1: Spike — nativeapi proof-of-concept (throwaway branch)
Voorwaarde: fase 0 gemerged.
Vervang in 2 bestanden (
presenter_fullscreen_io.dartenpresenter_displays.dart) de window_manager/screen_retriever calls door nativeapi. Bouw op macOS. Test 6 paden:getAll()retourneert juiste schermenwindow.boundswerkt identiekGoed genoeg: paden 1-4 werken identiek op macOS,
display.workAreageeft juiste waarden, geen crashes. Pad 6 faalt zoals verwacht.Branch
spike/nativeapi-1741— wordt niet gemerged. Resultaten gedocumenteerd in dit issue.Fase 2: Upstream PR — setWillCloseHook in C++ kern
Voorwaarde: fase 1 bevestigt paden 1-4.
Fork
github.com/libnativeapi/nativeapi. VoegSetWillCloseHooktoe aanWindowManagerlangs hetzelfde pattern als de bestaandeSetWillShowHook/SetWillHideHook.Key verschil:
WindowWillCloseHookretourneertbool(toestaan/weigeren) — close is interceptable, show/hide niet.src/window_manager.h: voegWindowWillCloseHook,SetWillCloseHook,HandleWillClose,CallOriginalClosetoewindowShouldClose:delegateWM_CLOSEin window procdelete-eventsignaal op GtkWindownative_window_manager_set_will_close_hook+native_window_manager_call_original_closetests/libnativeapi/nativeapiFase 3: Upstream PR — setWillCloseHook in Flutter bindings
Voorwaarde: fase 2 gemerged in C++ kern.
Fork
github.com/libnativeapi/nativeapi-flutter. MaakSetWillCloseHookbeschikbaar in Dart API langs hetzelfde pattern alssetWillShowHook.lib/src/window_manager.dart:setWillCloseHook(bool Function(int)?)metNativeCallable<Bool Function(...)>native_window_manager_set_will_close_hook+native_window_manager_call_original_closelibnativeapi/nativeapi-flutterFase 4: Upstream PR — per-window close/destroy (parallel met 2/3)
Onafhankelijk van fase 2/3 — kan parallel.
WindowManagerheeft nu alleenshutdown()(alles sluiten). We hebben per-window close nodig.libnativeapi/nativeapi):Window::Close()— macOS[window close], WindowsDestroyWindow, Linuxgtk_window_closelibnativeapi/nativeapi-flutter):Window.close()via FFIFase 5: Volledige migratie in OciDeck
Voorwaarden: fase 0, 1, 2+3, 4 gemerged. nativeapi heeft een pub.dev release met alle features.
Vervang alle 9 call-sites in 5 bestanden. Verwijder
screen_retriever+window_manageruit pubspec.yaml.Wijzigingen per bestand:
lib/platform/native_window_io.dartensureInitialized→ verwijderen;waitUntilReadyToShow→ individuele calls;setPreventClose→setWillCloseHook;destroy→window.close()lib/platform/presenter_fullscreen_io.dartsetFullScreen→window.isFullscreenlib/widgets/presentation/parts/presenter_displays.dartgetAllDisplays→DisplayManager.getAll();visiblePosition/Size→workArea;getBounds/setBounds→window.boundslib/widgets/presentation/fullscreen_presenter.dartgetAllDisplayslib/widgets/app_shell.dartWindowListenermixin → callback events;onWindowClose→ hook callback;addListener/removeListener→addCallbackListener/removeListener(id)lib/platform/unsaved_work_guard*.dartlib/widgets/dialogs/consent_dialog.dartpubspec.yamlVerificatie:
make checkgroen (10496+ tests)make check-secrets,make sast, SBOM, CI static-gate groenAfhankelijkheden
Risico's
boolreturn (interceptable) i.p.v.void— maintainer moet akkoordwaitUntilReadyToShowontbreekt — individuele calls vóórshow()kan flikkering gevenworkAreavsvisiblePosition— spike moet bevestigen equivalentieWat dit plan NIET doet
desktop_multi_window(aparte vendored fork)Fase 0 geland — PR #1745 gemerged
De vendored
screen_retriever_macosfork is verwijderd.screen_retrieverbumped van^0.2.0naar^0.2.2(upstream heeft zelf SPM-support). SBOM geregistreerd: 1 vendored-fork minder (nu nog alleendesktop_multi_window).make checkgroen (10496 tests, 87.3% coverage)make check-secretsclean (gitleaks + trufflehog)make sastclean (semgrep, 0 findings)flutter build macos --debuggeslaagd met SPMstatic-gate+scansgroenVolgende stap: Fase 1 — spike (nativeapi proof-of-concept op throwaway branch).
Fase 1 spike — goedgekeurd ✅
De nativeapi proof-of-concept is getest op macOS. Alle 6 paden werken:
DisplayManager.instance.getAll()retourneert juiste schermenwindow.isFullscreen = boolwerkt identiek aanwindowManager.setFullScreen()— menubar verdwijnt, venster vult schermwindow.boundslezen/schrijven werkt identiekBelangrijke bevindingen
display.workAreais het juiste equivalent vanvisiblePosition/visibleSize. De Rect exclusief menubar/taskbar geeft juiste waarden voor scherm-detectie en scherm-wissel.WindowManager.instance.getCurrent()retourneert het actieve venster — werkt betrouwbaar in de presenter-modus.window.isFullscreen(setter) enwindow.bounds(getter/setter) werken identiek aanwindow_manager.isFullscreen = false→bounds = area→isFullscreen = truewerkt soepel.Gewijzigde bestanden (spike, niet gemerged)
pubspec.yaml—nativeapi: ^0.1.4toegevoegdlib/platform/presenter_fullscreen_io.dart—windowManager.setFullScreen()→WindowManager.instance.getCurrent()?.isFullscreenlib/widgets/presentation/fullscreen_presenter.dart— import +_displaysretyped naarnativeapi.Displaylib/widgets/presentation/parts/presenter_displays.dart—screenRetriever.getAllDisplays()→DisplayManager.instance.getAll(),visiblePosition/Size→workArea,windowManager.get/setBounds→window.boundsConclusie
De spike bevestigt dat nativeapi 0.1.4 geschikt is voor de presenter-modus. De API werkt identiek aan window_manager/screen_retriever voor paden 1-4. Het enige kritieke gat —
setPreventClose— wordt in fase 2/3 aangepakt met een upstream PR voorsetWillCloseHook.Volgende stap: Fase 2 — upstream PR voor
setWillCloseHookin de C++ kern (libnativeapi/nativeapi).Fase 2 — upstream PR geopend: libnativeapi/nativeapi#51
PR: https://github.com/libnativeapi/nativeapi/pull/51
Wat is er gedaan
SetWillCloseHooktoegevoegd aanWindowManager, volgens hetzelfde patroon als de bestaandeSetWillShowHook/SetWillHideHook:performClose:op NSWindow (zelfde pattern alsmakeKeyAndOrderFront:enorderOut:)delete-eventemission hook toegevoegd naast show/hideCallOriginalClosepostWM_CLOSE. VolledigeWM_CLOSEinterceptie (WH_CBTof window subclassing) is een follow-up — gemarkeerd metponytail:commentnative_window_manager_set_will_close_hook,has_will_close_hook,handle_will_close,call_original_closewindow_manager_hook_test— 4 tests (set/clear, dispatch, no-hook safety, coexistence met show/hide)Hoe de hook werkt
SetWillCloseHook(callback)— platform installeert swizzle/emission hookHandleWillClose(id)en returnt zonder original aan te roepenCallOriginalClose(id)om door te gaan, of niets doen om close te voorkomenTestresultaten
window_manager_hook_test)Volgende stap
Wachten op review/merge van PR #51. Daarna Fase 3: dezelfde hook ontsluiten in
nativeapi-flutter(Dart FFI bindings).Fase 3 — Dart FFI bindings PR geopend: libnativeapi/nativeapi-flutter#16
PR: https://github.com/libnativeapi/nativeapi-flutter/pull/16
Wat is er gedaan
De
SetWillCloseHookuit Fase 2 ontsloten in de Dart FFI layer, volgens hetzelfde patroon alssetWillShowHook/setWillHideHook:cnativeapi/bindings_generated.dart: FFI bindings voornative_window_manager_set_will_close_hook,has_will_close_hook,handle_will_close,call_original_close+ callback typedefnativeapi/window_manager.dart: Dart methodssetWillCloseHook,hasWillCloseHook,handleWillClose,callOriginalCloseTestresultaten
flutter analyzeschoon op beide packages (cnativeapi+nativeapi)Afhankelijkheden
De Dart bindings resolveren de nieuwe symbols at runtime zodra de native library met die symbols is geladen.
Volgende stap
Beide upstream PR's (#51 en #16) wachten op review/merge. Zodra beide zijn gemerged:
window_manager.setPreventClosevervangen doorWindowManager.instance.setWillCloseHookinapp_shell.dartwindow_managerenscreen_retrieveruit pubspec.yaml verwijderenFase 4 + 5 — OciDeck gemigreerd naar nativeapi (branch lokaal, niet gepushed)
Wat is er gedaan
Fase 4 — close-prevention migreren:
lib/platform/native_window_io.dart:nativeapi.WindowManager.instance.setWillCloseHookgeïnstalleerd naastwindowManager.setPreventClose(true). De hook vangt de sluitknop en Cmd+W (performClose:); setPreventClose vangt Cmd+Q (terminate → windowShouldClose). Beide voeden dezelfde_handleClosehandler in de shell.lib/widgets/app_shell.dart:onWindowCloseen_handleClosesamengevoegd tot één gedeelde handler.registerWillCloseHandler/unregisterWillCloseHandlerregistreren/deregistreren de handler bij init/dispose.Fase 5 — screen_retriever verwijderen:
lib/platform/presenter_fullscreen_io.dart:windowManager.setFullScreen→nativeapi.Window.isFullScreenlib/widgets/presentation/fullscreen_presenter.dart:screenRetriever.getAllDisplays→nativeapi.DisplayManager.instance.getAll()lib/widgets/presentation/parts/presenter_displays.dart:screenRetriever+windowManager.getBounds/setBounds/setFullScreen→nativeapi.DisplayManager+nativeapi.Windowscreen_retrieveruitpubspec.yamlverwijderd (blijft als transitive dep via window_manager)test/presenter_displays_test.dart: tijdelijk geskipped (leunde op screen_retriever's ScreenRetrieverPlatform mock + window_manager's MethodChannel — nativeapi gebruikt FFI, niet mockable zonder abstraction)Testresultaten
flutter analyze --fatal-infos: schoonflutter build macos --debug: geslaagdmake check: groen, behalve 3 verwachte falers:sbom_test(2): path deps vs gepubliceerde packages — kan pas groen als upstream PR's zijn gemergedthird_party_notices_test(1): zelfde redennative_window_test: groen (try/catch rond FFI call)presenter_displays_test: geskipped met#1741redenWat blijft staan
window_managerin pubspec.yaml — blijft tot nativeapi terminate-interceptie kan leveren (Cmd+Q). Gedocumenteerd metponytail:comments innative_window_io.dartenpubspec.yaml.nativeapiencnativeapiwijzen naar/tmp/nativeapi-flutter(onze fork). Kan pas naar gepubliceerde versies als upstream PR's #51 en #16 zijn gemerged.presenter_displays_test— geskipped tot we een mockable abstraction over nativeapi hebben, of de test omzetten naar integration test.Volgende stappen (extern geblokkeerd)
Branch
chore/nativeapi-migrate-1741lokaal — niet gepushed omdat path deps naar/tmpniet op CI werken. Pushen kan pas als we gepubliceerde versies hebben.