특정 UI 요소를 대상으로 하거나 타겟 없이 자유롭게 표시할 수 있는 앱 기능을 사용자에게 안내하는 온보딩 오버레이를 생성하기 위한 유연한 Flutter 패키지입니다. onboard_overlay의 포크로 만들어졌으며, 오버레이의 외관과 동작에 대한 커스터마이징 및 제어가 향상되었습니다. 다양한 플랫폼에서 부드럽고 인터랙티브한 튜토리얼을 통해 신규 사용자에게 핵심 기능을 소개하는 데 이상적입니다.
사용 사례
앱 기능을 통해 새 사용자 안내하기
온보딩 중 특정 UI 요소 강조하기
사용자 정의 가능한 튜토리얼 흐름 만들기
다중 플랫폼 온보딩 경험 지원
단계별 안내 통합
주요 기능
대상 또는 자유 부유 오버레이 위치 지정
사용자 정의 가능한 오버레이 외관 및 애니메이션
다중 플랫폼 배포 지원
단계를 위한 유연한 콜백 처리
기존 Flutter 위젯과의 간편한 통합
적합한 대상
앱 온보딩 화면
사용자 교육 흐름
다중 플랫폼 애플리케이션
경량 온보딩 솔루션을 찾는 개발자
비타겟 오버레이 안내가 필요한 프로젝트
고려 사항
중첩된 콘텐츠를 위한 신중한 레이아웃 관리가 필요합니다
일관된 크로스플랫폼 뷰를 위해 추가 스타일링이 필요할 수 있습니다
제한된 내장 테마; 사용자 정의 필요
복잡한 탐색 워크플로에 적합하지 않습니다
명확한 사용자 상호작용 트리거와 함께 사용할 때 가장 효과적입니다
원본 README
연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.
onboarding_overlay
A flexible onboarding widget that can start and stop with an arbitrary number of
steps and arbitrary starting point
The text can be wrapped in a box, than support all kind of decorations and
only shape: BoxShape.rectangle For this to happen, you have to set
hasLabelBox equal to true, labelBoxDecoration, which supports only
BoxDecoration
The Label box also supports having an arrow. This is controlled by
hasArrow. The position is not calculated automatically. The default
position is top. You will have to specify the position via arrowPosition by
using the enum ArrowPosition. The ArrowPosition.top and
ArrowPosition.bottom calculates the horizontal position automatically
according to the widget of interest (the focused one which is visible through
the overlay), the other arrow positions are centered in the label box e.g.
ArrowPosition.topCenter, ArrowPosition.bottomCenter. In addition there
are 2 new settings from v3.0.0 - ArrowPosition.autoVertical and
ArrowPosition.autoVerticalCenter, which will take care of positioning the
arrow automatically relative to the label box and widget position.
The onboarding also supports forwarding the onTap event to the widget of
interest. You can control the behavior for each step using the
overlayBehavior. It accepts the Flutter enum HitTestBehavior. By default, the
value used is HitTestBehavior.opaque.
HitTestBehavior.opaque ignores the clicks on the focused widget and always
will navigate to next step
HitTestBehavior.translucent forwards clicks on the focused widget and on the
overlay in the same time
HitTestBehavior.deferToChild the clicks on the hole are forwarded to the
focused widget, clicks on the overlay navigates to next step.
Sometimes the titleText and the bodyText might not fit well in the
constrained label box, because of the long texts, longer translations or
smaller screens. There are 2 behaviors for this scenario. The default one
will limit the title to 2 lines and the bodyText to 5 lines and will overflow
both with ellipsis, the second one is to automatically resize the texts. This
is controlled by the Onboarding property autoSizeTexts, which default value
is false.
The onboarding can show only a portion of the defined steps with a specific
start index. Use showWithSteps method. Remember that the steps indexes are
0-based (starting from zero)
The onboarding can start from a specific index and play until the end step
is reached. Use showFromIndex method. Remember that the steps indexes are
0-based (starting from zero)
From v.3.0.0 if you want to show something else, different from just
title and explanation text, then stepBuilder is for you. With
stepBuilder, you can change the layout, add images or something else.
Important: If you want to inherit your App Theme from your app instead of
using the style properties. You need to wrap your stepBuilder code with a
Scaffold or Material widgets.
Important: Clicks on the overlay are ignored if stepBuilder is set. Clicks
on the hole or on the widget depend on the HitTestBehavior.
using HitTestBehavior.translucent and HitTestBehavior.deferToChild will
forward clicks on the hole to the focused widget
using HitTestBehavior.opaque ignores clicks on the hole and on the overlay
are ignored. Call callbacks provided by the stepBuilder
From v.3.0.0 Combining onTapCallback with the overlayBehavior gives
more control.
If you want to capture any clicks and decide what to do depending on the area
that was clicked - use HitTestBehavior.opaque
if you want to be able to click on the focused widget and control when to go
to next step or close - use HitTestBehavior.translucent
If you want to capture clicks only on the overlay, the clicks on the hole will
not be controlled by the callback - use HitTestBehavior.deferToChild
Using the TapArea you can specify what happens when the user clicked on
certain area. The possible options are hole, label and overlay
OnboardingStep(
focusNode: focusNodes[4],
titleText: 'Menu',
bodyText: 'You can open menu from here',
overlayColor: Colors.green.withOpacity(0.9),
shape: constCircleBorder(),
overlayBehavior: HitTestBehavior.translucent,
onTapCallback:
(TapArea area, VoidCallback next, VoidCallback close) {
if (area == TapArea.hole) {
next();
}
},
),
From v.3.0.0 It is possible to combine onTapCallback and
stepBuilder. No navigation will be executed except if you call next()
method from onTapCallback or the stepBuilder. You can customize the
behavior using the TapArea enum to get the area where the user clicked. By
using the HitTestBehavior you can again customize if the clicks on the
hole are ignored or forwarded to the focused widget. Again if you define the
overlayBehavior with HitTestBehavior.deferToChild the click on the hole
or the widget in focus will not be controlled by the onTapCallback
From v3.0.0 there is an additional OverlayController (ChangeNotifier)
attached to the OverlayState that provides the currentIndex,
currentStep and isVisible.
finalOnboardingState? onboarding = Onboarding.of(context);
if( onboarding?.controller.isVisible ?? false) {
// do some logic here
}
From v.3.0.0 you can also add a pulsing animation around the focused
widget. Pulse animation will be displayed showPulseAnimation on an
OnboardingStep is set to true. In addition you can change the inner and
outer colors of the pulse animation. Thanks to the author
Gautier of the
pal package for the inspiration.
From v.3.0.0 you can show a red border around the label box for
debugging purposes by using an Onboarding parameter debugBoundaries
which is false by default.
From v.3.1.0 The package can be used with
ResponsiveFramework. For
this to work as expected you need to perform these changes to your code:
move Onboarding widget under the ResponsiveWrapper.builder
wrap with a Builder to be able to access the inherited widget for
ResponsiveWrapperData
manually calculate scale for width and height
pass the calculated values to the Onboarding widget.
From 3.2.1 [stepPainterBuilder] is a callback function that passes the
context, the title String, the hole Rect nd if the arrow position isTop
bool. By default it is null and it will use the LabelPainter. You can
use this to draw custom shapes around the hole. You can use the
LabelPainter as a reference
From 3.2.3
[animateOverlayHole] is a property that can be set to false to disable the animation of the overlay hole.
[labelBoxMargin] property to the OnboardingStep so that the user can
control the space around the label box. Especially useful for limiting maximum width of the label box.
Example:
OnboardingStep(
focusNode: focusNodes[0],
titleText: 'Tap anywhere to continue ',
labelBoxMargin: constEdgeInsets.symmetric(horizontal: 16.0), // <--This ensures that there will be always padding around the label box on the left and right sides
labelBoxDecoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: constBorderRadius.all(Radius.circular(8.0)),
color: constColor(0xFF00E1FF),
),
),
From 3.2.4
[labelBoxVerticalDistance] property to the OnboardingStep so that the user can customize the space between the label box and the overlay hole.
Example:
OnboardingStep(
focusNode: focusNodes[0],
titleText: 'Tap anywhere to continue',
labelBoxVerticalDistance: 16.0, // default is kSpace = 4.0
),