vehicle_frame_capture 4.3.0
vehicle_frame_capture: ^4.3.0 copied to clipboard
A guided, multi-angle vehicle photo capture flow: a rectangular frame overlay, live device-level feedback, and camera integration in one widget.
Changelog #
4.3.0 - 2026-09-28 #
Added #
- Tap-to-focus: tapping the
CameraScreenpreview moves both focus and exposure metering to the tapped point, with a brief focus ring. Focus stays continuous (FocusMode.auto) around the point, so it keeps tracking as the user reframes. Rapid taps are coalesced into the latest point rather than queued. Metering resets to the camera default at every new step. Controlled by the newCameraScreen.enableTapToFocus(defaulttrue); no-op on cameras without point-metering support.
Changed #
- The frame overlay, level indicator and step header no longer absorb taps (wrapped in
IgnorePointer), so taps reach the preview.
4.2.1 - 2026-09-28 #
Changed #
CameraScreen.resolutionPresetnow defaults toResolutionPreset.max(the highest resolution the device camera supports) instead ofResolutionPreset.veryHigh(1080p). PassresolutionPreset: ResolutionPreset.veryHighto keep the 4.2.0 behavior.
4.2.0 - 2026-09-25 #
Changed #
CameraScreen.resolutionPresetnow defaults toResolutionPreset.veryHigh(1080p) instead ofResolutionPreset.medium(480p), which was too low-resolution for vehicle listing photos. PassresolutionPreset: ResolutionPreset.mediumto keep the old behavior.
Added #
ResolutionPresetandCameraLensDirectionare re-exported frompackage:vehicle_frame_capture/vehicle_frame_capture.dart, so callers can configureCameraScreenwithout depending oncameradirectly.
4.1.0 - 2026-09-18 #
Added #
VehicleSide.buttonPanel— the button/switch panel to the left of the steering wheel.VehicleSide.driverSeat— the driver's seat, including its side control buttons (distinct fromfrontSeats, which frames both front seats together).- Both are added to
VehicleSide.catalogInterior(notdefaultInterior, which is unchanged).
Changed #
VehicleSide.driverDoor'sinstructionnow explicitly calls out capturing the door's control buttons.
4.0.1 - 2026-08-20 #
Fixed #
- iOS: the camera preview and the captured photo could each end up rotated relative to what the user actually saw, because
CameraControllertracks physical device orientation independently of the app's forced landscape UI, and (separately)lockCaptureOrientation'slandscapeLeft/landscapeRightmapping for the still-photo pipeline is inverted from the one that fixes the live preview.CameraScreennow locks the UI tolandscapeRightand the still-capture orientation tolandscapeLefton iOS specifically. Android is unaffected — it never had this bug — and keeps its original unrestricted landscape behavior.
Chore #
- Added
analysis_options.yamlto this package.flutter_lintswas already adev_dependencybut had noanalysis_options.yamlwiring it in, so analysis was silently running with bare Dart defaults instead of the ruleset the package claims to use. - Reformatted the package with
dart formatfor a cleanflutter pub publishgit-state check.
4.0.0 - 2026-08-20 #
Breaking changes #
VehicleSideis no longer anenum— it's a plain class withid,category,label,instruction, andrequiresLevelfields.VehicleSide.valuesno longer exists (useVehicleSide.defaultValuesorVehicleSide.cataloginstead), and it can no longer be used in exhaustiveswitchstatements or as aconstpattern outside this package.- Reshaped the default angle set and grew it from 9 to 12 steps.
left/right(single side-profile shots) are replaced by four corner/side angles —frontRight/frontSide/rearRight/rearLeft;insideFrontRow/insideBackRow/dashboardOdometerare replaced bycockpit/driverDoor/dashboard.CaptureFlow/CameraScreennow default toVehicleSide.defaultValues(6 exterior + 6 interior) instead of the old 9. CameraScreen.levelYTolerance/levelZTolerancedefaults changed from1.0/2.0to2.0/3.0(m/s²) — the level check was too strict to comfortably hold by hand.- The internal single-axis horizon-line indicator (
LevelHorizonPainter) is replaced byLevelCrosshairPainter, a two-axis bubble-level indicator with a different constructor (bubbleOffsetinstead of an externally-applied rotation).
Added #
VehicleCaptureCategory— tags everyVehicleSideasexteriororinterior, for building tabbed capture UIs.VehicleSide.catalog(catalogExterior+catalogInterior) — ~35 additional built-in angles beyond the default 12: wheels, windshield, headlights/taillights, license plate, VIN plate, undercarriage, engine bay, instrument cluster, glove box, seat belts, cargo area, and more.VehicleSide.custom({label, instruction, category, requiresLevel, id})— define one-off angles outside the catalog at runtime.VehicleSide.requiresLevel— per-angle opt-out of the device-level check. Set tofalsein the catalog for angles inherently shot tilted up/down (roof, undercarriage, engine bay, wheels, VIN plate, pedals, etc.) so their shutter is never permanently blocked by a level check that could never pass.CameraScreenhides the level indicator entirely and always enables the shutter for such steps.- Two-axis level indicator: roll (Y) and pitch (Z) are now combined into a single crosshair/bubble-level reticle instead of a rotating horizon line driven by roll alone.
3.0.0 - 2026-08-06 #
Breaking changes #
CameraScreenno longer shows a review screen by default. Previously it always navigated toSummaryScreenafter the last step; now it pops immediately with the capturedList<File>unless you passshowSummary: true.VehicleFramePainter,CaptureButton, and the internalLevelHorizonPainterno longer hardcodeColors.greenAccent/Colors.white— they takereadyColor/idleColorparameters (both default to the same colors as before, so uncustomized call sites keep the same look).CaptureFlow()now takes an optionalsides: List<VehicleSide>?parameter instead of always building all 9 steps internally. Passing nothing still defaults to all 9, in the same order.- Dropped the
google_fontsdependency. All text styling now goes throughVehicleCaptureTheme(falling back to the ambientThemewhen not overridden) instead of a hardcoded font. SummaryScreennow takes atheme: VehicleCaptureThemeparameter instead of hardcoded colors, and is exported from the library (export 'src/screens/summary_screen.dart') so it can be reused standalone.
Added #
VehicleCaptureTheme— colors (readyColor,idleColor,dangerColor,primaryColor,summaryBackgroundColor) and optional text styles for the whole flow.CameraScreen.theme— pass aVehicleCaptureThemeto restyle the entire flow.CameraScreen.steps— capture a custom subset/order ofVehicleSides instead of always all 9.CameraScreen.resolutionPresetandpreferredLensDirection— configurable camera quality and front/back selection (falls back to the first available camera if the preferred lens isn't found).CameraScreen.levelYTolerance/levelZTolerance— tune how strict the "level" check is.CameraScreen.onPhotoCapturedandonStepChangedcallbacks — react to progress live instead of only getting a result at the end.
2.0.0 - 2026-08-06 #
Breaking changes #
VehicleFramePainterno longer takes asideparameter and itsisDetectedfield is renamed toisReady— it now draws one universal rectangular frame for every step instead of a per-side car-silhouette shape.CaptureButton'sisDetectedfield is renamed toisReady.- Removed on-device object detection entirely (previously backed by
google_mlkit_object_detection). The "ready" (green) state now reflects device level only. VehicleSidegained 3 new values:engineBay,dashboardOdometer,trunk—CaptureFlownow has 9 steps instead of 6.CameraScreennow manages its own orientation lifecycle (locks landscape on entry, restores portrait on exit) instead of requiring the caller to do so.
Changed #
- Replaced the six hand-drawn car-silhouette
Paths with a single rounded-rectangle overlay. - Fixed the camera preview stretching in landscape (now sized to its native aspect ratio via
FittedBox/BoxFit.coverand cropped instead of distorted). - Fixed the horizon-level indicator pivoting off-center (it swung like a lever anchored at one end instead of rotating evenly from its middle).
- Sensor-driven UI updates (device level, tilt angle) now use
ValueNotifier/ValueListenableBuilderinstead of whole-screensetState, so the camera preview and other static UI no longer rebuild on every accelerometer sample. - Switched from the deprecated
accelerometerEventstoaccelerometerEventStream(samplingPeriod: SensorInterval.uiInterval). - License changed from a proprietary license to MIT.
Removed #
google_mlkit_object_detection,image,image_picker,lottie,path, andpath_providerdependencies — none were exercised by this package's code.
1.0.0 - 2026-02-10 #
Added #
- Initial release of vehicle_frame_capture package
- 6 capture modes: Front, Left, Right, Back, Inside Front Row, Inside Back Row
- Custom frame overlays for each vehicle view
- Device leveling detection using gyroscope/accelerometer
- Visual feedback (green highlight) when vehicle is detected and device is level
- Automatic capture flow management
VehicleFramePainterwidget for drawing custom framesCaptureFlowmodel for managing capture stateCameraScreenwidget for camera integration- Complete documentation and examples