← Zurück zu Finn
AgentFinn
Mobile Leistung und Barrierefreiheit
Verbessert Reaktionsfähigkeit und assistiven Zugang gemeinsam anhand gemessener Start-, Listen-, Bild- und Interaktionsabläufe.
mobile-performance-accessibility
Entdecke, wie der Skill hilftWann ist der Skill hilfreich?
Nutze dies bei ruckelnden Listen oder unvollständiger Screenreaderbedienung.
Wobei hilft er dir?
- Misst Start- und Bildkosten mit repräsentativer Last.
- Nutzt Virtualisierung und begrenzte Bild- sowie Speicherressourcen.
- Prüft semantische Beschriftung, Fokus und VoiceOver beziehungsweise TalkBack.
Das könntest du fragen
Optimiere eine lange Kontaktliste und verifiziere Auswahl per Screenreader auf dem Zielgerät. Scrolle repräsentative Daten und wähle per assistiver Navigation einen unsichtbaren Kontakt. Miss Frames und prüfe korrekte Beschriftung und Auswahl recycelter Zeilen.
Ausführliche Dokumentation
Hier findest du die ursprüngliche Anleitung, Beispiele und Prüfschritte des Skills in ihrer Originalsprache.
Weniger anzeigen
Mobile Performance & Accessibility
Deliver smooth 60/120fps scrolling, fast cold start and low memory footprint on real mobile hardware while ensuring every screen is operable with iOS VoiceOver, Android TalkBack, Dynamic Type and Switch Control.
1. List virtualization and frame-budget discipline (16.6ms / 8.3ms)
- Measure before optimizing: profile in release/profile mode (
flutter run --profile, RN Perf Monitor / Flashlight / Xcode Instruments / Android Studio Profiler), as debug builds skew timings. - Virtualized lists only:
- React Native: use
FlashList,LegendListorFlatList—never.map()inside aScrollViewfor dynamic collections. Pass a stablekeyExtractor, memoizerenderItem(useCallback) and row components (React.memo), avoid inline style/closure allocations in rows, and provideestimatedItemSize/getItemLayout. - Flutter: use
ListView.builder,ListView.separatedorCustomScrollView+SliverList.builderwithconstchild widgets,itemExtent/prototypeItemwhen heights are uniform, and avoidshrinkWrap: truein nested scroll views (useSlivers). - Native: use
LazyVStack/UICollectionViewDiffableDataSource(iOS) andLazyColumnwith stablekey = { it.id }andcontentType(Compose).
- React Native: use
- Keep UI & JS/main threads unblocked:
- Run gesture-driven animations on the UI/render thread (
react-native-reanimatedworklets,useNativeDriver: true, FlutterAnimationControllerscoped to leafAnimatedBuilder/RepaintBoundary). - Offload large JSON parsing, crypto, sorting/filtering and image processing to background threads/isolates (
Isolate.runin Flutter, native workers in RN,Dispatchers.Defaultin Kotlin, Swift concurrency).
- Run gesture-driven animations on the UI/render thread (
2. Startup time (TTI), images and memory management
- Fast cold start: defer non-critical SDK init, analytics and background sync until after the first screen renders (
InteractionManager/ post-frame callback), tying splash dismissal (SplashScreen.preventAutoHideAsync()->hideAsync()) to initial route readiness. - Image sizing & caching: request thumbnails sized to display dimensions (
width * pixelRatio), use cached image components (expo-image,cached_network_image,Coil/Nuke), and release media buffers on unmount to prevent OOM termination.
3. Mobile accessibility (VoiceOver & TalkBack)
- Explicit semantics, roles and states:
- Give every interactive element an accessible role (
accessibilityRole="button"/"switch"/"tab"/"header"in RN;Semantics(button: true, header: true)in Flutter;.accessibilityAddTraits/Modifier.semanticsin native). - Provide a concise, localized
accessibilityLabelfor every icon-only button, close button, avatar and badge, and expose state (disabled,selected,checked,busy,expanded).
- Give every interactive element an accessible role (
- Composite card grouping & custom actions:
- Group multi-line list rows/cards into one focusable element (
accessible={true}in RN,MergeSemanticsin Flutter,.accessibilityElement(children: .combine)in SwiftUI,Modifier.semantics(mergeDescendants = true)in Compose) so screen readers read the card in one swipe instead of 6 separate stops. - Attach
accessibilityActions/CustomAccessibilityActionfor secondary row actions (Delete, Favorite, Share) so screen-reader and Switch Control users never depend on swipe gestures.
- Group multi-line list rows/cards into one focusable element (
- Focus management, touch targets, Dynamic Type (200%) & Reduced Motion:
- Move focus to opened modals/dialogs, restore on close, and announce async errors/toasts (
AccessibilityInfo.announceForAccessibility,accessibilityLiveRegion="polite",SemanticsService.announce). - Enforce hit targets
>= 44x44 pt(iOS) /48x48 dp(Android) (hitSlop/MaterialTapTargetSize.padded). - Never fix text container heights in pixels; allow layouts to reflow at 200% font scaling and honor OS reduced-motion settings (
isReduceMotionEnabled/MediaQuery.disableAnimationsOf(context)).
- Move focus to opened modals/dialogs, restore on close, and announce async errors/toasts (
Before you finish
- Dynamic lists are virtualized with stable keys, memoized/
constrows and no nestedshrinkWrap. - Animations run on the UI thread; heavy CPU work and large images do not block frames or leak memory.
- Controls have roles, localized labels, states, card grouping and
>= 44pt/48dphit targets. - Screens announce async errors/modals, survive 200% font scaling, and respect reduced motion.
Enthaltene Dateien 2
LICENSE.txtSKILL.md
