cupertino_native_plus 0.0.11 copy "cupertino_native_plus: ^0.0.11" to clipboard
cupertino_native_plus: ^0.0.11 copied to clipboard

PlatformiOSmacOS

Native Liquid Glass widgets for iOS and macOS with pixel-perfect fidelity.

0.0.11 #

Features #

  • Swift Package Manager support: Added Package.swift for both ios/ and macos/ plugin targets following the Flutter SPM plugin-author convention. Sources moved to <platform>/cupertino_native_plus/Sources/cupertino_native_plus/ via git mv (history preserved). The plugin now resolves under Flutter SPM resolution alongside CocoaPods (both build paths supported). iOS Package.swift declares the SVGKit SPM dependency. Podspecs updated to the new source paths; the macOS podspec gains PrivacyInfo resource_bundles.

Bug fixes #

  • macOS compile errors (pre-existing, surfaced by SPM build): FlutterPlatformView adopted on macOS NSObject subclasses where the protocol does not exist in FlutterMacOS (only FlutterPlatformViewFactory does). Adoption removed from LiquidGlassContainerNSView, FallbackLiquidGlassContainerNSView, LiquidTextNSView, FallbackLiquidTextNSView — factories continue to use FlutterPlatformViewFactory correctly. NSImage.tinted(with:) extension declared in four files with conflicting signatures; canonical version retained in ImageUtils.swift, duplicates removed from CupertinoIconNSView and CupertinoPopupMenuButtonNSView, the template-specific variant in CupertinoButtonNSView renamed to templateTinted(with:) along with its call sites. CupertinoButtonNSView referenced dict outside its if let scope in the non-SwiftUI branch — replaced with a local optional dictionary access; the let title = button.title conditional bindings were against the non-optional NSButton.title property — replaced with direct property access. GlassButtonSwiftUI (macOS) title-only Label { Text(...) } initializer became ambiguous against the new Label(_ configuration: LabelStyleConfiguration) overload introduced in the macOS 26 SDK — replaced with direct Text(...) matching the iOS sibling file.

0.0.10 #

Bug fixes #

  • Launch-time selection-pill morph on CNTabBar: Fixed a visible animation glitch where the native tab bar's selection pill morphed through every item during the initial label-rendering refresh cycle. The refresh logic in CupertinoTabBarPlatformView (refresh method) cycles selectedItem across all items to force UITabBar to layout labels (required on iOS < 16); each assignment was driving the implicit selection-pill animation. The refresh cycle (both single-bar and split-bar paths) is now wrapped in UIView.setAnimationsEnabled(false) / setAnimationsEnabled(true) so labels still render correctly while the user-visible morph is suppressed.
  • PlatformViewGuard 500 ms fallback flash on release cold start: The guard's hot-restart protection is debug-only by design (release builds have no prior Dart isolate to leave stale FlutterPlatformViewsController registrations), but the 500 ms readiness delay was applied in both modes, producing a brief flash of Flutter fallback widgets before native views appeared on first launch. PlatformViewGuard.isReady and readyNotifier now initialize to true in kReleaseMode, eliminating the cold-start flash while preserving the debug-mode hot-restart safety window.

0.0.9 #

Bug fixes #

  • iOS 26 watchdog kill in backgrounded split tab bar: Fixed cpu_resource_fatal termination caused by an infinite DispatchQueue.main.async re-dispatch loop in CupertinoTabBarPlatformView.activateSplitConstraintsIfNeeded when a split tab bar was created while the app was backgrounded or before the view entered the window hierarchy. Activation is now parked in a pendingSplitActivation struct and resumed via UIApplication.willEnterForegroundNotification or container layout/window callbacks (CupertinoTabBarContainerView.didMoveToWindow / layoutSubviews), eliminating the main-thread spin and ~1.6s startup stall.

Internal #

  • Added os_log instrumentation under subsystem cupertino_native_plus, category split-activation, for diagnosing split tab bar constraint activation timing in the field.

0.0.8 #

Features #

  • splitRightAsButton: New CNTabBar property that makes right-side split items act as plain buttons instead of selectable tabs. When enabled, tapping right items fires onTap without changing the visual selection — selection is controlled solely by currentIndex. Useful for action buttons like settings or compose that shouldn't participate in tab selection.

Bug fixes #

  • Split tab bar default selection: Fixed an issue where the rightmost item appeared visually selected alongside the current tab when using split: true with rightCount: 1. The root cause was UITabBar resetting selectedItem during item re-assignment for label rendering, with the final layout pass missing selection restoration.
  • Non-split tab bar selection after layout: Fixed the same item re-assignment selection loss in non-split tab bar mode.
  • PlatformException on iOS hot restart: Added PlatformViewGuard that delays platform-view creation by 500 ms on startup, preventing PlatformException(recreating_view) crashes when the Flutter engine hasn't fully purged stale view registrations from a previous Dart isolate. All native components (CNIconView, LiquidGlassContainer, CNTabBar) now show Flutter fallbacks during this brief window.
  • iOS platform view cleanup: Added deinit to all platform views (CupertinoTabBarPlatformView, CupertinoTabBarSearchPlatformView, LiquidGlassContainerView, LiquidTextPlatformView, FloatingIslandPlatformView, CupertinoSearchBarPlatformView) to properly clear method channel handlers and remove views from the hierarchy on deallocation.

Performance #

  • Stable platform view keys: Added UniqueKey to all components (CNButton, CNIconView, CNSlider, CNSwitch, CNSegmentedControl, CNPopupMenuButton, CNGlassButtonGroup, CNFloatingIsland, CNSearchBar, CNSearchScaffold) to prevent Flutter from destroying and recreating native views on parent rebuilds. Previously, any parent setState could trigger full native view recreation causing incomplete rendering.
  • Cached FutureBuilder futures: CNGlassButtonGroup and CNIconView now cache their async creation futures and only rebuild them when source data actually changes, preventing platform view flicker on rebuilds.
  • SwiftUI ObservableObject pattern: LiquidGlassContainer and CNLiquidText iOS views now use @ObservedObject view models instead of replacing hostingController.rootView on every config update. This lets SwiftUI diff and update only changed properties, preserving animations and avoiding full view tree recreation.
  • Lightweight splitRightAsButton sync: Toggling splitRightAsButton now uses a dedicated setSplitRightAsButton method channel call instead of triggering a full setLayout rebuild that destroys and recreates all tab bar instances.

0.0.7 #

cupertino_native_plus — native Liquid Glass and Cupertino-style controls for iOS and macOS via platform views. This release ships the current public API, unified icon handling, and documentation. See MIGRATION.md for breaking changes.

Breaking changes #

  • CNImageAssetCNIcon: Shared icon/image values use CNIcon with named constructors (CNIcon.symbol, CNIcon.asset, CNIcon.xcasset, CNIcon.svg, CNIcon.png, CNIcon.jpg, CNIcon.data).
  • Platform icon widget → CNIconView: The native StatefulWidget that draws symbols and assets is CNIconView (not CNIcon, which is the model type).
  • CNTabBarItem: Icons are only icon / activeIcon as CNIcon?. Fields such as imageAsset / activeImageAsset and customIcon / activeCustomIcon are removed in favor of CNIcon sources.
  • Buttons & menus: CNButton, CNButtonData, glass button groups, and related APIs use CNIcon? for icon slots.

Features #

  • Buttons & glass: CNButton, CNButton.icon, CNGlassButtonGroup, CNButtonData, glass styles (CNButtonStyle.glass, prominentGlass, …), glass effect unioning (glassEffectUnionId), LiquidGlassContainer, CNLiquidText, experimental CNGlassCard.
  • Icons: CNIcon model and CNIconView widget; SF Symbols, xcassets, Flutter asset paths, and raw bytes (SVG/PNG/JPG); CNSymbol + CNSymbolRenderingMode for legacy/symbol flows.
  • Tab bar: CNTabBar with split mode, badges, lightweight native setBadges when only badges change; iOS 26-style search tab (CNTabBarSearchItem, CNTabBarSearchStyle, CNTabBarSearchController); CNTabBarNative (UITabBarController integration) and CNSearchScaffold.
  • Other controls: CNSlider, CNSwitch, CNSegmentedControl, CNPopupMenuButton (including preserveTopToBottomOrder), CNPopupGesture, CNSearchBar, CNToast, CNFloatingIsland.
  • Platform version: PlatformVersion auto-initializes; uses Platform.operatingSystemVersion parsing (reliable in release); supportsSFSymbols (iOS 13+, macOS 11+); Liquid Glass vs SF Symbol capability split (iOS 26+ vs iOS 13+).
  • Images on native: Resolution-aware asset loading (@2x/@3x), shared ImageUtils on iOS/macOS; PNG/SVG/JPG pipelines and tinting.

Improvements #

  • Label styles (typography on native): TextStyle on CNButtonTheme.labelStyle, CNTabBar (labelStyle / activeLabelStyle), CNSegmentedControl, CNPopupMenuButtonfontSize, fontWeight (100–900), italic, fontFamily via encodeTextStyle; label color uses theme/tint/labelColor on native, not TextStyle.color in the channel map.
  • Glass & theme: Clearer glass material and CNButtonTheme (tint, labelColor, iconColor, backgroundColor, labelStyle).
  • Native loading order: Glass buttons and related paths prefer xcasset names, then Flutter asset paths.
  • Tab bar: Split tab bar constraint fixes; unified CNIcon pipeline for items.
  • Swift: GlassButtonIconConfig / CNIcon decoding aligned with Dart.

Bug fixes (highlights) #

  • Version detection no longer relies on fragile platform channels in release builds.
  • SF Symbols on iOS 13+ via supportsSFSymbols (not gated on iOS 26).
  • Tab bar fallbacks, badge-only updates, split-mode selection, search keyboard behavior, popup menu ordering, modal shadow artifacts, MissingPluginException guards on hot reload, LiquidGlassContainer gestures (IgnorePointer where needed), dark mode / glass sync, PNG/SVG orientation and tinting, CNButton tap targets in Cupertino fallback.

Documentation #

  • README.md: Icon model vs CNIconView, Label styles, migration quick reference, ^0.0.7 snippet.
  • MIGRATION.md: Step-by-step migration for 0.0.7.

0.0.6 #

  • Dark Mode Support for LiquidGlassContainer: Added automatic dark mode detection and synchronization for LiquidGlassContainer, ensuring the glass effect correctly adapts to Flutter's theme changes
  • Gesture Detection Fixes: Fixed gesture handling in LiquidGlassContainer by wrapping platform views in IgnorePointer, preventing the native view from intercepting touch events and allowing child widgets to receive gestures properly
  • Brightness Syncing Improvements: Enhanced brightness synchronization for icons and other components, ensuring they automatically update when the system theme changes

0.0.5 #

  • Performance Improvements: Added method channel updates for button groups to prevent full rebuilds and eliminate freezes when updating button parameters
  • Preserved Animations: Button groups now update smoothly without losing native animations when button properties change (icon, color, image asset, etc.)
  • Efficient Updates: Implemented granular updates for individual buttons in groups, only updating changed buttons instead of rebuilding the entire group
  • Reactive SwiftUI Updates: Converted button group SwiftUI views to use ObservableObject pattern for efficient reactive updates
  • Button Parameter Updates: Individual buttons in groups can now be updated dynamically via method channels without full view rebuilds

0.0.4 #

  • PNG Image Support: Added full support for PNG images in all components (buttons, icons, popup menus, tab bars, glass button groups)
  • Automatic Asset Resolution: Implemented automatic asset resolution based on device pixel ratio, similar to Flutter's automatic asset selection. The system now automatically selects the appropriate resolution-specific asset (e.g., assets/icons/3.0x/checkcircle.png for @3x devices) or falls back to the closest bigger size
  • ImageUtils Consolidation: Consolidated all image loading, format detection, scaling, and tinting logic into a shared ImageUtils.swift class for better code maintainability and consistency
  • Fixed PNG Rendering: Fixed PNG image rendering issues in buttons and glass button groups
  • Fixed Image Orientation: Fixed image flipping issues for both PNG and SVG images when colors are applied
  • Made buttonIcon Optional: Made buttonIcon parameter optional in CNPopupMenuButton.icon constructor, allowing developers to use only buttonImageAsset or buttonCustomIcon
  • Improved Glass Effect Appearance: Fixed glass effect appearance synchronization with Flutter's theme mode to prevent dark-to-light transitions on initial render
  • Enhanced Image Format Detection: Improved automatic image format detection from file extensions and magic bytes
  • Better Fallback Handling: Improved fallback behavior when asset paths fail to load, ensuring images still render from provided image bytes

0.0.3 #

  • Updated README to showcase all icon types (SVG assets, custom icons, and SF Symbols)
  • Added comprehensive examples for all icon types in Button, Icon, Popup Menu Button, and Tab Bar sections
  • Added icon support overview at the beginning of "What's in the package" section
  • Clarified that all components support multiple icon types with unified priority system

0.0.2 #

  • Updated README with corrected version requirements and improved documentation
  • Fixed iOS minimum version requirement (13.0 instead of 14.0)
  • Removed incorrect Xcode 26 beta requirement
  • Added Contributing and License sections
  • Improved package description and introduction

0.0.1 #

  • Initial release
  • Fixed iOS 26+ version detection using Platform.operatingSystemVersion parsing
  • Native Liquid Glass widgets for iOS and macOS
  • Support for CNButton, native icon widget, CNSlider, CNSwitch, CNTabBar, CNPopupMenuButton, CNSegmentedControl
  • Glass effect unioning for grouped buttons
  • LiquidGlassContainer for applying glass effects to any widget