real_page_flip 1.11.4 copy "real_page_flip: ^1.11.4" to clipboard
real_page_flip: ^1.11.4 copied to clipboard

A high-fidelity 3D-like page flip engine for Flutter. Features physics-based paper fold effects with realistic shadows, sound, and haptic feedback for ultra-smooth performance.

Changelog #

All notable changes to the real_page_flip package will be documented here. For the example application (Realbook app), see example/CHANGELOG.md.

1.11.4 - 2026-06-29 #

๐Ÿ”ง ๋นŒ๋“œ/๋ฐฐํฌ #

  • Gradle standalone ๋นŒ๋“œ ํ˜ธํ™˜์„ฑ ๊ฐœ์„  ๋ฐ Dart analyzer ๊ฒฝ๊ณ  ํ•ด๊ฒฐ | Improved Gradle standalone build compatibility and resolved Dart analyzer warnings

๐Ÿงช ํ…Œ์ŠคํŠธ #

  • ํด๋ฆฝ ์ •๋ ฌ, ํ”Œ๋žฉ ํ”„๋ก ํŠธ ํ…์Šค์ฒ˜, ํ”Œ๋ฆฝ ์ปค๋ธŒ ํ…Œ์ŠคํŠธ์˜ ๋ฆฐํŠธ ๊ฒฝ๊ณ (๋ถˆํ•„์š”ํ•œ ์ ‘๊ทผ/ํ˜•๋ณ€ํ™˜/๊ด„ํ˜ธ) ์ˆ˜์ • | Fixed lint warnings in clip alignment, flap front texture, and flip curve tests

1.11.3 - 2026-06-28 #

โœจ ์˜ˆ์ œ ๋ ˆ์ด์•„์›ƒ ๊ฐœ์„  ๋ฐ ์ง๊ด€์ ์ธ ๋ฐ๋ชจ ์—์…‹ ์ œ๊ณต (Example App & Demo Assets Overhaul) #

  • ๋ณต์žกํ•œ ๋Œ€์‹œ๋ณด๋“œ ๋Œ€์‹  ํŽ˜์ด์ง€ํ”Œ๋ฆฝ ํšจ๊ณผ(1๋‹จ ๋‹จ๋ฉด ๋ฐ 2๋‹จ ์–‘๋ฉด)๊ฐ€ ํ•œ๋ˆˆ์— ๋ณด์ด๋„๋ก ๊ธฐ๋ณธ ํ™”๋ฉด์„ ํ’€์Šคํฌ๋ฆฐ ์ฑ… ๋ทฐ์–ด๋กœ ๊ฐœ์„  | Redesigned the example app to show a clean, fullscreen book view by default so developers can focus directly on the page flip effects.
  • ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ˆจ๊น€/ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํ† ๊ธ€ ์˜ต์…˜์„ ์ƒ๋‹จ ํˆด๋ฐ”์— ์ œ๊ณต | Added a layout toolbar at the top allowing developers to switch between 1-Column and 2-Column views and toggle the advanced Tuning Deck overlay.
  • ์‹œ์ž‘ ์‹œ ์ž๋™์œผ๋กœ 1๋‹จ ๋ฐ 2๋‹จ ๋„˜๊น€ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์—ฐ์† ์‹คํ–‰ํ•ด ์ฃผ๋Š” autoplay/presentation ๋ชจ๋“œ ๋„์ž… | Implemented a startup autoplay demonstration sequence that showcases single-page and double-spread animations smoothly.
  • ์ƒˆ๋กœ์šด ๋ ˆ์ด์•„์›ƒ ๊ธฐ์ค€์˜ ๊ณ ํ™”์งˆ ๋ฐ๋ชจ ์˜์ƒ ๋ฐ ์Šคํฌ๋ฆฐ์ƒท ์—์…‹์„ README์™€ ํŒจํ‚ค์ง€์— ํ†ตํ•ฉ ๋ฐฐํฌ | Generated and packaged clean, dashboard-free animation WebP videos and layout screenshots.

1.11.2 - 2026-06-28 #

โœจ ๋ฌธ์„œํ™” ๋ฐ ๋ฐ๋ชจ ์—์…‹ ์ตœ์ ํ™” (Documentation & Demo Assets) #

  • ๋Œ€ํ™”ํ˜• Web ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ๋ชจ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ๋…นํ™”ํ•œ ์‹ ๊ทœ ํŽ˜์ด์ง€ ๋„˜๊น€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋น„๋””์˜ค(page_flip_demo.webp)๋ฅผ ํฌํ•จํ•œ ์ตœ์‹  WebP ํฌ๋งท ๋ฏธ๋””์–ด ์—์…‹ ์ œ๊ณต | Added a high-fidelity interaction demo video (page_flip_demo.webp) showcasing full-cycle page flip animations and the Control Deck live.
  • ์–‘๋ฉด ๋ณด๊ธฐ(Double-Spread) ๋ชจ๋“œ ์™„๋ฒฝ ์ง€์› ์•ˆ๋‚ด ๋ฐ ์‹ ๊ทœ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฐ๋ชจ ๋ฏธ๋””์–ด๋ฅผ README.md ๋ฌธ์„œ์— ํ†ตํ•ฉ ๋ฐ˜์˜ | Integrated double-spread support notices and the new web interactive preview into the root README.md.

1.11.1 - 2026-06-28 #

โœจ ์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ์„  (Example Application) #

  • ๋‹คํฌ ๋ชจ๋“œ, ๋„ค์˜จ ์ปฌ๋Ÿฌ ๊ทธ๋ผ๋ฐ์ด์…˜, Glassmorphic ํŒจ๋„์„ ๋„์ž…ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ํ”„๋ฆฌ๋ฏธ์—„ ํ†ค์•ค๋งค๋„ˆ๋กœ ์˜ˆ์ œ ์•ฑ ๋””์ž์ธ์„ ์ „๋ฉด ๊ฐœํŽธ | Completely redesigned the example app with a premium developer-focused look using dark theme, glassmorphic panels, and neon gradients.
  • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์ƒํƒœ๋ฐ”(ํŽ˜์ด์ง€์ˆ˜, ์—”์ง„ ์ƒํƒœ ๋“ฑ) ๋ฐ PageFlipConfig ํŒŒ๋ผ๋ฏธํ„ฐ(๋ฏผ๊ฐ๋„, ๋ถˆํˆฌ๋ช…๋„, AMO ์„ฑ๋Šฅ ๋ ˆ๋ฒจ ๋“ฑ)๋ฅผ ์ฆ‰์„์—์„œ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™”ํ˜• Control Deck ํƒ‘์žฌ | Implemented an interactive Control Deck with sliders, segmented selectors, and toggles to dynamically test and profile page flip settings live.

1.11.0 - 2026-06-28 #

โœจ ์„ฑ๋Šฅ ์ตœ์ ํ™” (Performance) #

  • ์ €์‚ฌ์–‘ ๊ธฐ๊ธฐ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ PerformanceProfile ๋„์ž… ๋ฐ ๋งค์‰ฌ ๋ Œ๋”๋ง ๋™์  ๊ฑด๋„ˆ๋›ฐ๊ธฐ ์ตœ์ ํ™” | Introduced PerformanceProfile and dynamic mesh-rendering skip to optimize GPU performance for low-end devices.
  • PerformanceProfile.low ๋ชจ๋“œ์ผ ๋•Œ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณ€ํ™”๊ฐ€ ์ ์€ ๊ตฌ๊ฐ„(๋“œ๋ž˜๊ทธ ์ดˆ๊ธฐ๋‚˜ ๋„˜๊น€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ดˆ์ค‘๋ฐ˜)์—์„œ ๋ณต์žกํ•œ Mesh ์—ฐ์‚ฐ์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๋‹จ์ˆœ ํ…์Šค์ฒ˜๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๋ Œ๋”๋ง ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ๊ฐ | Added skipEarlyMesh to bypass complex Mesh rendering during the invisible initial/middle phases of animations on low-profile devices.
  • ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€ ํด๋ฐฑ(Live page fallback)์ด Double-spread ๋ชจ๋“œ์—๋„ ์ œ๊ฑฐ๋˜๋„๋ก ํ•˜์—ฌ, ๋ฌด๊ฑฐ์šด ์œ„์ ฏ ํŠธ๋ฆฌ๊ฐ€ ์ค‘๋ณต ๋ Œ๋”๋ง๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” GlobalKey ์ถฉ๋Œ ๋ฐ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ๋ฐฉ์ง€ | Fixed duplicate GlobalKey crashes by removing live page fallback from double-spread OffscreenPreRenderer.

๐Ÿงช ํ…Œ์ŠคํŠธ (Tests) #

  • ์ตœ์ ํ™”๋œ ๋ Œ๋”๋ง ๋ถ„๊ธฐ์— ๋งž์ถ”์–ด ๋ ˆ์ด์–ด ๋ทฐ ํ…Œ์ŠคํŠธ๋“ค์ด ๋ผ์ด๋ธŒ ํŽ˜์ด์ง€ ๋Œ€์‹  Opaque Paper Fallback์„ ๊ฒ€์ฆํ•˜๋„๋ก ๊ฐœ์„  | Updated layer view tests to assert Opaque Paper fallback correctly, reflecting the removed live page fallback optimization.

1.10.0 - 2026-06-28 #

๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฐ ์•ˆ์ •์„ฑ ๊ฒ€์ฆ (Test & Stability) #

  • ๋‹จ๋ฉด ๋ชจ๋“œ(Single Backward) ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ์—ฃ์ง€ ์ผ€์ด์Šค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋ฐ ๊ตฌ๋ฒ„์ „ ํ…Œ์ŠคํŠธ ๋กœ์ง ์ตœ์‹ ํ™” | Added geometry edge case tests and updated outdated test expectations for single backward flips.
  • PageFlipClipper์™€ PageFlipOpenClipper ๊ฐ„์˜ ํด๋ฆฌํ•‘ ํŒจ์Šค ๊ต์ฐจ์  ์ •ํ•ฉ์„ฑ ๋ฐ ํ™”๋ฉด ๋น„์œจ๋ณ„ ์˜ค์ฐจ ์—†๋Š” ์™„์ „ํ•œ ์ผ์น˜ ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ | Added rigorous clip path alignment tests across multiple aspect ratios to ensure perfect boundary intersections.
  • ์—ฐ์†์ ์ธ ๋“œ๋ž˜๊ทธ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ทจ์†Œ ์‹œ ๋ฐœ์ƒํ•˜๋Š” Race Condition ๋ฐฉ์ง€ ์œ„์ ฏ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ | Added widget integration tests to verify robust handling of rapid, continuous drag and cancellation race conditions.

1.9.9 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • ๋’ค์ง‘ํžˆ๋Š” ํŽ˜์ด์ง€์˜ ๊ทธ๋ฆผ์ž ์˜์—ญ(Revealed Page Shadow)์ด ์ง์„  clipRect ๋Œ€์‹  ์‹ค์ œ ๊ณก์„  ํด๋“œ ๊ฒฝ๋กœ(clipPath)๋ฅผ ๋”ฐ๋ผ ์ž˜๋ฆฌ๋„๋ก ๊ฐœ์„ ํ•˜์—ฌ ๋ชจ๋“  ํ™”๋ฉด ๋น„์œจ์—์„œ ๋‘ ๋ฒˆ์งธ ๋ ˆ์ด์–ด์˜ ๊ณก์„  ๊ฒฝ๊ณ„์„ ๊ณผ ๊ทธ๋ฆผ์ž๊ฐ€ ์™„์ „ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์ˆ˜์ • | Replaced straight clipRect with curved clipPath for Revealed Page Shadow, ensuring perfect alignment between the curved fold line boundary and the shadow on all screen aspect ratios

1.9.8 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • ๋‹จ๋ฉด ๋ชจ๋“œ ์ด์ „์žฅ(Backward) ์ „ํ™˜ ์‹œ ์ ‘ํžˆ๋Š” ์ข…์ด์˜ ์ž˜๋ฆฌ๋Š” ๋ฉด์ ๊ณผ ๊ทธ๋ฆผ์ž ๋ฐฉํ–ฅ์ด ๊ผฌ์ด๋˜ ์ง€์˜ค๋ฉ”ํŠธ๋ฆฌ ๊ณ„์‚ฐ ์˜ค๋ฅ˜ ์ˆ˜์ • | Fixed Single Backward flip geometry where flap direction and material width calculations were inverted
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ธ์ ‘ ํŽ˜์ด์ง€๋“ค์ด Offstage ์„ค์ •์œผ๋กœ ์ธํ•ด ํ”Œ๋Ÿฌํ„ฐ ์—”์ง„์—์„œ ํŽ˜์ธํŒ…์ด ์ƒ๋žต๋˜์–ด ์Šค๋ƒ…์ƒท(toImage) ์บก์ฒ˜์— ์˜๊ตฌ ์‹คํŒจํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • | Fixed background adjacent page snapshots failing to capture due to Offstage omitting painting
  • ํ™”๋ฉด ๋ฐ– ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ Œ๋”๋ง ์˜์—ญ์˜ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”(Semantics), ํฌ์ปค์Šค(Focus Scope), ๋งˆ์šฐ์Šค/ํ„ฐ์น˜ ์ž…๋ ฅ(IgnorePointer) ๋ˆ„์ˆ˜๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” OffscreenPreRenderer ๋„์ž… | Introduced OffscreenPreRenderer to prevent focus, semantics, and pointer interaction leaks from off-screen pre-rendered pages

1.9.7 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • onMethodCall() ์ „์ฒด try-catch ์ ์šฉ์œผ๋กœ SecurityException ๋“ฑ ๋ชจ๋“  ์˜ˆ์™ธ๊ฐ€ result.error()๋กœ ์ „๋‹ฌ๋˜์–ด Dart HapticFeedback fallback์ด ์•ˆ์ •์ ์œผ๋กœ ๋ฐœ๋™ | Wrapped onMethodCall() in try-catch so all exceptions (including SecurityException) propagate as result.error(), ensuring reliable Dart HapticFeedback fallback
  • playFallback()์˜ vibrator?.vibrate() ํ˜ธ์ถœ ์˜ˆ์™ธ๊ฐ€ ์ƒ์œ„๋กœ ์ „ํŒŒ๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • | Guarded vibrator?.vibrate() in playFallback() so exceptions don't bubble up unhandled

1.9.6 - 2026-06-28 #

โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง #

  • PageFlipGeometry์˜ ๋ชจ๋“  late final ํ•„๋“œ๋ฅผ final + factory constructor๋กœ ์ „ํ™˜ํ•˜์—ฌ LateInitializationError ์œ„ํ—˜ ์ œ๊ฑฐ | Converted 22 late final fields to plain final via factory constructor, eliminating LateInitializationError risk

๐Ÿ› ์ˆ˜์ • #

  • ์ •์  Shader ์บ์‹œ(static Map<String, Shader>)๊ฐ€ ์ ˆ๋Œ€ dispose๋˜์ง€ ์•Š์•„ GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๋˜ ๋ˆ„์ˆ˜ ์ˆ˜์ •. ์ธ๋ผ์ธ createShader๋กœ ๋Œ€์ฒด | Fixed unbounded GPU memory leak from static Shader cache โ€” inlined simple gradient creation instead
  • build() ๋‚ด addPostFrameCallback์ด LayoutBuilder ์žฌํ˜ธ์ถœ ์‹œ ์ค‘๋ณต ๋“ฑ๋ก๋˜์–ด updateCachedWidth/captureSnapshots๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • | Fixed stacked post-frame callbacks in build() causing redundant updateCachedWidth/captureSnapshots
  • snapshot ๋ถ€์žฌ ์‹œ Offstage์˜ child๊ฐ€ ๋‹จ์ƒ‰ paper๋กœ ๊ต์ฒด๋˜์–ด capture pipeline์ด ์˜๊ตฌ ์†์ƒ๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • (liveFallbackIndices ์ œ๊ฑฐ) | Fixed snapshot pipeline corruption where missing snapshots caused Offstage to render paper instead of live pages (removed liveFallbackIndices)
  • _scheduleCaptureRetry์˜ ๋‹จ์ผ ์Šค์นผ๋ผ ํ•„๋“œ๊ฐ€ ๋ฎ์–ด์จ์ ธ ์ž˜๋ชป๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ retry๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • | Fixed capture retry parameter overwrite bug in _scheduleCaptureRetry
  • ๋“œ๋ž˜๊ทธ ์ˆ˜์šฉ ํ›„ ์ˆ˜์ง ์ œ์Šค์ฒ˜๋ฅผ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์—†์–ด Scrollable/SelectableText๊ฐ€ block๋˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • | Fixed post-accept vertical gesture rejection so Scrollable/SelectableText can receive scrolls

1.9.5 - 2026-06-28 #

๐Ÿ› ์ˆ˜์ • #

  • ์œ„์ ฏ ์†Œ๋ฉธ ๋ฐ ์ œ์Šค์ฒ˜ ๋ ˆ์ด์–ด ์–ธ๋งˆ์šดํŠธ ์‹œ์ ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” Null check ๋ฐ lifecycle ํฌ๋ž˜์‹œ ๋ฐฉ์ง€ | Guarded against null safety/lifecycle crashes during unmounting and disposal
  • ํ™”๋ฉด ํฌ๊ธฐ ๋ณ€๊ฒฝ ์‹œ ์บ์‹œ ๋ฌดํšจํ™” ๋ฐ ๋ ˆ์ด์•„์›ƒ ์žฌ๊ณ„์‚ฐ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ | Added cache invalidation and layout recalculation on size changes
  • endRevealStrength ๊ธฐ๋ณธ๊ฐ’์„ 0.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , settling ๋‹จ๊ณ„์—์„œ์˜ ๋ฏธ์„ธ ๋น„์ฃผ์–ผ ์ž”์ƒ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ค‘๊ฐ„ ๋ ˆ์ด์–ด fade transition ์ถ”๊ฐ€ | Changed endRevealStrength default to 0.0 and added middle layer fade transition to eliminate settled artifacts
  • flapContentRevealStart/End ๋ถ„๋ชจ 0 ์–ต์ œ ์ฒ˜๋ฆฌ | Handled potential division by zero in flapContentRevealStart/End divisor

1.9.4 - 2026-06-28 #

โœจ ๊ธฐ๋Šฅ #

  • PageFlipConfig.copyWith() 26๊ฐœ ํ•„๋“œ ์ „์ˆ˜ ์ง€์› ๋ฐ clear-flag๋กœ nullable ํ•„๋“œ ์ดˆ๊ธฐํ™” | Added full copyWith() for all 26 fields with clear-flags for nullable fields

๐Ÿ› ์ˆ˜์ • #

  • PageFlipConfig.== ์—ฐ์‚ฐ์ž์— semanticBuilder ํ•„๋“œ ๋ˆ„๋ฝ๋˜์–ด ์ž˜๋ชป๋œ ๋™๋“ฑ์„ฑ ๋น„๊ต | Fixed == operator missing semanticBuilder field causing incorrect equality
  • PageFlipStateController.dispose()๊ฐ€ AnimationController.dispose()๋ฅผ ์ค‘๋ณต ํ˜ธ์ถœํ•˜๋˜ ๋ฒ„๊ทธ (๋น„๋ฉฑ๋“ฑ์„ฑ ๋ณดํ˜ธ) | Fixed dispose() calling AnimationController.dispose() twice (idempotency guard)

๐Ÿงช ํ…Œ์ŠคํŠธ #

  • Phase I-VI ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๋Œ€๊ทœ๋ชจ ์ถ”๊ฐ€: ์„ค์ • ์ •ํ™•์„ฑ, ์ƒํƒœ ์ปจํŠธ๋กค๋Ÿฌ ๋ถ„๊ธฐ, ๋ฌผ๋ฆฌ ์†์„ฑ๊ธฐ๋ฐ˜ 60+๊ฐœ, ์œ„์ ฏ ์ œ์Šค์ฒ˜, ์–‘๋ฉด๋ชจ๋“œยท๋ฉ€ํ‹ฐํ„ฐ์น˜, ๊ธฐํ•˜ ๋ถˆ๋ณ€์†์„ฑ, ๋ฉ”๋ชจ๋ฆฌ ์ƒ๋ช…์ฃผ๊ธฐ, ํ”Œ๋žซํผ ์ฑ„๋„, ์ ‘๊ทผ์„ฑ, ๋Œ€์šฉ๋Ÿ‰ ์•„์ดํ…œ, ์ŠคํŠธ๋ ˆ์Šค | Added comprehensive Phase I-VI tests: 60+ physics property-based, gesture/edge/widget, double-spread/multitouch integration, geometry invariants, memory lifecycle, platform channels, accessibility, large itemCount, stress
  • PageFlipConfig ์„œ๋ช…, ๋ณต์‚ฌ, ์Šคํ”„๋ ˆ๋“œ๋ชจ๋“œ 3๊ฐœ ํŒŒ์ผ 55๊ฐœ ํ…Œ์ŠคํŠธ | Config copyWith, equality, spread mode tests
  • ์ปจํŠธ๋กค๋Ÿฌ ์—ฃ์ง€์ผ€์ด์Šค 30๊ฐœ ๋ฐ ํ”„๋กœ๊ทธ๋žจ API ๊ฒ€์ฆ | Controller edge case and programmatic API tests
  • ์œ„์ ฏ ์ œ์Šค์ฒ˜ยท์ฝœ๋ฐฑยท์—ฃ์ง€ํƒญ ํ†ตํ•ฉ 30๊ฐœ ํ…Œ์ŠคํŠธ + 5๊ฐœ ๊ธฐ์กด ํŒŒ์ผ ๊ฐœ์„  | Widget gesture/callback/edge tap tests with 5 existing file enhancements

๐Ÿ› ์ˆ˜์ • #

  • ํ–…ํ‹ฑ ๋ฌผ๋ฆฌ ๊ณ„์‚ฐ์ด ํ•ญ์ƒ 400px๋กœ ํ•˜๋“œ์ฝ”๋”ฉ๋˜์–ด ๊ธฐ๊ธฐ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ง„๋™ ๊ฐ•๋„๊ฐ€ ๋‹ฌ๋ผ์ง€๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • (์‹ค์ œ ๋ทฐํฌํŠธ ํญ ์‚ฌ์šฉ)
  • ํŽ˜์ด์ง€๋ฅผ ๋งŽ์ด ๋„˜๊ธธ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ˆ„์ ๋˜๋˜ PaperPhysicsEngine ๋งต ๋ฌดํ•œ ์„ฑ์žฅ ๋ฒ„๊ทธ ์ˆ˜์ •
  • goToPage()๊ฐ€ ๋“œ๋ž˜๊ทธ/์• ๋‹ˆ๋ฉ”์ด์…˜ ์ค‘ ํ˜ธ์ถœ๋˜๋ฉด ๋‚ด๋ถ€ ์ƒํƒœ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ • (guard ์ถ”๊ฐ€)
  • ํ–…ํ‹ฑ ํ…์Šค์ฒ˜ ๋…ธ์ด์ฆˆ์˜ .abs()๋กœ ์ธํ•œ ๋ถˆ์—ฐ์† ๋„ํ•จ์ˆ˜๋กœ ์ง„๋™ ์ถœ๋ ฅ์— "๋”ธ๊น" ๋А๋‚Œ์ด ๋ฐœ์ƒํ•˜๋˜ ๋ฌธ์ œ ์ˆ˜์ •

โšก ์„ฑ๋Šฅ #

  • ํŽ˜์ด์ง€ํ”Œ๋ฆฝ ๋ ˆ์ด์–ด ์Šค๋ƒ…์ƒท ๋ Œ๋”๋ง์—์„œ ๋ถˆํ•„์š”ํ•œ RepaintBoundary ์ œ๊ฑฐ๋กœ GPU compositing layer ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ

โ™ป๏ธ ๋ฆฌํŒฉํ† ๋ง #

  • onHandleEffect์˜ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ enum ๋งค์นญ(name.contains('Haptic'))์„ ์•ˆ์ „ํ•œ switch ๋ฌธ์œผ๋กœ ๋ณ€๊ฒฝ
  • PageFlipGestureRecognizer์— @Deprecated ๋งˆํ‚น (PageFlipGestureLayer๋กœ ๋Œ€์ฒด๋จ)
  • PageFlipEffectHandler ์ธํ„ฐํŽ˜์ด์Šค์— viewportWidth setter ์ถ”๊ฐ€
  • shouldRepaint์— ๋ˆ„๋ฝ๋œ performanceProfile ํ•„๋“œ ๊ฒ€์‚ฌ ์ถ”๊ฐ€

1.9.0 - 2026-06-26 #

โœจ ๊ธฐ๋Šฅ #

  • ์™ธ๋ถ€ vibration ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ณ ์„ฑ๋Šฅ ํ”Œ๋žซํผ ์ฑ„๋„ ๊ธฐ๋ฐ˜ AdvancedHapticEngine ์‹ ๊ทœ ๊ตฌ์ถ•
  • Android (Core Haptics Composition APIs - Click/Tick/Thud) ๋ฐ iOS (CoreHaptics - CHHapticEngine) ๋งž์ถคํ˜• ๋„ค์ดํ‹ฐ๋ธŒ ์ง„๋™ ์—ฐ๋™
  • ๋“œ๋ž˜๊ทธ ์†๋„์— ๋น„๋ก€ํ•˜๋Š” ๋™์  ์ฃผ๊ธฐ ์Šค๋กœํ‹€๋ง(Dynamic Throttling) ๋ฐ ๋งˆ์ฐฐ/๊ฐ•์„ฑ์— ๋”ฐ๋ฅธ ๋ฐ˜์‘์„ฑ ์ตœ์ ํ™”

1.8.1 - 2026-06-25 #

๐Ÿ› ์ˆ˜์ • #

  • 2๋‹จ๋ณด๊ธฐ ํŽ˜์ด์ง€ํ”Œ๋ฆฝ settle ๋‹จ๊ณ„(progress 0.85-0.95)์—์„œ ๋ชฉ์ ์ง€ ๋Œ€์‹  ํ˜„์žฌ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ ํ‘œ์‹œ๋˜๋˜ ๋ฒ„๊ทธ ์ˆ˜์ •
  • EPUB TOC ํŽ˜์ด์ง€(epub:type="toc")๊ฐ€ ์ผ๋ฐ˜ ์ฑ•ํ„ฐ๋กœ ๋ถ„ํ• ๋˜์–ด ํŽ˜์ด์ง€๊ฐ€ ํฉ์–ด์ง€๋˜ ๋ฌธ์ œ ์ˆ˜์ •

1.8.0 - 2026-06-25 #

โœจ ๊ธฐ๋Šฅ #

  • PaperTexturePreset ๋ชจ๋ธ ์ถ”๊ฐ€ (smooth/standard/textured/kraft)
  • PageFlipConfig์— hapticTexturePreset ์„ค์ • ์—ฐ๋™

โšก ์„ฑ๋Šฅ #

  • TXT ํŒŒ์ผ ์ธ์ฝ”๋”ฉ ํƒ์ง€ ๊ฐœ์„  (UTF-8 BOM โ†’ UTF-8 โ†’ latin1 fallback)

1.7.2 - 2026-06-24 #

Changed #

  • Extracted PageFlipPainter and PageFlipClippers into separate part files for cleaner code organization.
  • Haptic engine enhancements:
    • iOS/Android platform-specific texture haptic paths with speed-adaptive throttling.
    • Weber-Fechner non-linear amplitude curve (pow 1.3-1.4) for slip-release and micro-slip events.
    • Independent iOS/Android texture tick throttle tracking.

1.7.1 - 2026-06-24 #

Changed #

  • Haptic engine redesigned with event-specific vibration signatures:
    • startHaptic: single 45ms pulse at amplitude 180
    • impulseHaptic: crisp double-tap pattern for tap-flip confirmation
    • slipRelease: intensity-based double-tap pattern (pages slipping feel)
    • microSlip: intensity-based single pulse (acceleration bursts)
    • sound: 28ms pulse synchronized with audio
    • texturedHaptic: duration reduced to 10-30ms for cleaner throttle separation
  • Added _vibratePattern() using Vibration.vibrate(pattern:, intensities:) for multi-pulse haptic sequences on amplitude-control-capable devices
  • Added _iosHaptic() / _cancelHaptic() primitives
  • Removed _triggerImpact() / HapticImpactType in favour of event-specific handlers
  • Stick-slip events now use their intensity field (0.0-1.0) to dynamically scale vibration duration and amplitude instead of hardcoded light/medium presets

1.7.0 - 2026-06-23 #

Added #

  • DefaultPageFlipEffectHandler is now exported from the public API (package:real_page_flip/real_page_flip.dart)

Fixed #

  • _triggerImpact() now fires Vibration.vibrate() after HapticFeedback, ensuring haptic vibration is actually felt on Android devices where HapticFeedback is too subtle or imperceptible. Impact events (startHaptic, impulseHaptic) now produce real motor vibration.
  • Non-amplitude-control Android devices now use Vibration.vibrate(duration:) instead of HapticFeedback.selectionClick() during paper-texture haptics (texturedHaptic), providing noticeably stronger feedback.
  • Duration clamp raised from 5-20ms to 8-35ms so paper-texture vibration pulses are long enough to feel.

1.6.2 - 2026-06-23 #

Changed #

  • Minor style and formatting lint fixes to pass strict quality gate standards.

1.6.1 - 2026-06-23 #

Fixed #

  • Single backward page flip: unified foldX and flapMaterialWidth formulas with forward direction. Now single backward foldX moves right-to-left (same as forward) and flap grows with progress, eliminating directional inconsistency.

1.6.0 - 2026-06-22 #

Added #

  • DevicePerformanceProfile enum (high/medium/low) for adaptive rendering quality.
  • performanceProfile field on PageFlipConfig and PageFlipLayerView.
  • DefaultPageFlipEffectHandler now accepts an optional performanceProfile to throttle haptic feedback on low-end devices.

Fixed #

  • Single-page backward flip: corrected flapRightOfFold to false for single-page mode so the flap extends left from foldX (consistent with forward direction).
  • flapSnapshotSpreadIndex now returns currentIndex - 1 for single backward (previously returned currentIndex), ensuring the correct snap page is displayed as the flap texture.

1.5.1 - 2026-06-21 #

Changed #

  • Split page flip engine library into part files (page_flip_geometry.dart, page_flip_gesture.dart) for cleaner code organization.
  • Fixed 12 dart compiler/linter warnings in page flip engine and widgets.

1.5.0 - 2026-06-21 #

Added #

  • flapRightOfFold field on PageFlipGeometry unifying four-mode flap-direction logic.
  • Single-page backward: spine-anchored fold with flap following finger direction.
  • Direction-aware highlight, fold-darkening, edge-fade, and fold-fade gradients.

Changed #

  • Single-page forward: foldX anchored at left spine (x=0), flap extends rightward, shrinking toward spine as page turns.
  • Double-spread backward: flap extends RIGHT of foldX (previously left).
  • buildFlapScreenClipPath supports flap-right-of-fold paths with corrected bleed.
  • Angle limits simplified for single-page mode.

Fixed #

  • Backward single-page flap now shows page content during flip.
  • Backward flap curvature direction corrected.
  • Clip bleed direction corrected for backward double-spread.
  • Single-page fold line no longer moves to opposite edge (eliminated tearing look).

1.4.2 - 2026-06-04 #

Added #

  • Updated documentation to clarify that the engine is optimized for vertical mobile devices and does not support horizontal two-page view.

1.4.1 - 2026-06-04 #

Changed #

  • Relicensed the package under the MIT License.

1.4.0 - 2026-05-14 #

Added #

  • Direction-aware flip thresholds: cutoffForward and cutoffPrevious independently control drag-release completion.
  • 12 new test files covering geometry, physics, controllers, and widgets.
  • Named geometry constants extracted from inline magic numbers.

Changed #

  • PageFlipStateController accepts configurable thresholds from PageFlipConfig.
  • PageFlipPainter constructor is now const.
  • cutoffForward default: 0.8 โ†’ 0.4, cutoffPrevious default: 0.1 โ†’ 0.4.

Fixed #

  • PageFlipConfig, PaperPhysicsConfig, PaperPhysicsFrame equality/hashCode.

1.3.0 - 2026-05-09 #

Added #

  • Dark Mode Support: PageFlipConfig.backgroundColor now defaults to null and reads Theme.of(context).scaffoldBackgroundColor at render time.
  • Adaptive shadow intensity for dark backgrounds.

Changed #

  • PageFlipConfig.backgroundColor type: Color โ†’ Color?.

1.2.4 - 2026-05-02 #

Fixed #

  • Fixed 404 error on legacy interaction demo video URL.

1.2.3 - 2026-05-02 #

Fixed #

  • Replaced WebP tags with raw markdown video links for pub.dev compatibility.

1.2.2 - 2026-05-02 #

Fixed #

  • Fixed broken video tags on pub.dev.

1.2.1 - 2026-05-02 #

Added #

  • High-fidelity extended interaction recording.
  • Legacy Interaction Demo section.

1.2.0 - 2026-05-02 #

Added #

  • Production-quality demo assets.
  • Optimized README for pub.dev.

1.1.3 - 2026-05-02 #

Added #

  • High-fidelity interaction recording of the actual engine.

1.1.2 - 2026-05-02 #

Added #

  • Snappy demo video with immediate interaction start.
  • Absolute asset URLs for pub.dev compatibility.

1.1.1 - 2026-05-02 #

Added #

  • Professional teaser video, GPU optimization guides, Opus audio assets.
  • Example app with unique content and stress tests.

1.9.3 - 2026-06-27 #

๐Ÿ› ์ˆ˜์ • #

  • ์‚ฌ์šด๋“œ ์žฌ์ƒ์„ stop()+seek()+resume() ํŒจํ„ด์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ„ํ—์  ์žฌ์ƒ ์‹คํŒจ ํ•ด๊ฒฐ (play()์˜ setSource() asset I/O ์ œ๊ฑฐ)
  • Android VIBRATE ํผ๋ฏธ์…˜ ๋ˆ„๋ฝ์œผ๋กœ ํ–…ํ‹ฑ์ด ์ „ํ˜€ ์ž‘๋™ํ•˜์ง€ ์•Š๋˜ ๋ฒ„๊ทธ ์ˆ˜์ • (AndroidManifest์— ๊ถŒํ•œ ์ถ”๊ฐ€)
  • ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋Ÿฌ๊ทธ์ธ vibrator ๋ฏธ์‚ฌ์šฉ ์‹œ error ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ • (Dart fallback ํ™œ์„ฑํ™”)

1.9.2 - 2026-06-27 #

๐Ÿ› ์ˆ˜์ • #

  • _playSound์—์„œ resume() ๋Œ€์‹  play()๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ • (audioplayers 6.x: stop() ํ›„ resume()์€ no-op)
  • AdvancedHapticEngine.playTransient() ๋ฐ playThud()์— HapticFeedback ํด๋ฐฑ ์ถ”๊ฐ€ (MethodChannel ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ์ง„๋™ ๋ณด์žฅ)

1.1.0 - 2026-05-01 #

Added #

  • Physics-based paper friction interaction logic.
  • Dynamic geometry rendering with hardware-accelerated clipping.
  • Integrated haptic feedback and sound effect system.
  • Semantics support for accessibility.

Changed #

  • Refactored PageFlipWidget to use PageFlipStateController.
  • Improved snapshot capturing in PreRenderManager.

Fixed #

  • Layout boundary issues in Stack configurations.
  • Memory leak in PreRenderManager snapshots.
6
likes
0
points
1.41k
downloads

Publisher

verified publishersharebible.org

Weekly Downloads

A high-fidelity 3D-like page flip engine for Flutter. Features physics-based paper fold effects with realistic shadows, sound, and haptic feedback for ultra-smooth performance.

Homepage
Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

audioplayers, flutter

More

Packages that depend on real_page_flip

Packages that implement real_page_flip