분류, 패키지 및 저장소 검색

dots_indicator 표지
패키지 상세v5.0.0

dots_indicator

예를 들어 PageView의 진행 상황을 보여주는 점 표시기

AndroidiOSWebmacOSWindowsLinux
30일 다운로드
17.8만
좋아요
768
Pub 점수
160

패키지 설치

flutter pub add dots_indicator

패키지 개요

공개 정보를 바탕으로 생성한 선택 가이드입니다.

PageView와 같은 스크롤 가능한 위젯 내 현재 위치를 표시하기 위한 시각적 점 인디케이터를 제공하는 플러터 패키지입니다. 사용자가 페이지 또는 슬라이드 시퀀스에서의 진행 상황을 이해할 수 있도록 하며, 사용자 정의 가능한 점의 외관과 동작을 지원합니다. 다양한 테마, 크기 및 애니메이션을 지원하여 온보딩 화면, 이미지 슬라이더 및 안내 투어에 적합합니다. 가볍고 모든 주요 플랫폼과 호환됩니다.

사용 사례

  • 온보딩 화면
  • 이미지 슬라이더
  • 가이드 투어
  • 폼 마법사
  • 카루셀 탐색
  • 슬라이드 쇼 지시기

주요 기능

  • 사용자 정의 가능한 점 크기 및 색상
  • 페이지 간 부드러운 애니메이션
  • 여러 테마를 지원합니다
  • 반응형 디자인
  • PageView와의 간편한 통합
  • Platform-agnostic

적합한 대상

  • 모바일 앱 개발자
  • UI/UX 디자이너
  • 온보딩 흐름
  • 인터랙티브 튜토리얼
  • 다중 페이지 콘텐츠 표시

고려 사항

  • PageView와 수동 동기화 필요
  • 스타일링을 넘어서는 사용자 정의가 제한적
  • 내장된 스와이프 제스처 없음
  • 스크롤되지 않는 콘텐츠에는 적합하지 않습니다
  • 추가 상태 관리가 필요할 수 있습니다

원본 README

연결된 소스 저장소의 README 원문 스냅샷입니다. 최신 내용은 저장소에서 확인하세요.

dots_indicator

Widget to display dots indicator to show a position (for a PageView for example).

Installation

You just need to add dots_indicator as a dependency in your pubspec.yaml file.

dependencies:
  dots_indicator: ^5.0.0

Breaking change in 5.0.0: this package now uses the standalone material_ui package instead of package:flutter/material.dart. Your app must also use material_ui (or keep the deprecated MaterialUiCompatibilityBridge), otherwise tapping a dot (onTap) throws No Material widget found. Requires Flutter >=3.44.0 and Dart ^3.12.0. See the CHANGELOG for details.

Quick start

The typical use case is to pair DotsIndicator with a PageView, syncing position to the controller's current page:

class MyPageView extends StatefulWidget {
  const MyPageView({super.key});

  @override
  State<MyPageView> createState() => _MyPageViewState();
}

class _MyPageViewState extends State<MyPageView> {
  final _pages = const [Page1(), Page2(), Page3()];
  final _pageController = PageController();
  double _currentPage = 0;

  @override
  void initState() {
    super.initState();
    _pageController.addListener(() {
      setState(() => _currentPage = _pageController.page ?? 0);
    });
  }

  @override
  void dispose() {
    _pageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Expanded(
          child: PageView(controller: _pageController, children: _pages),
        ),
        DotsIndicator(
          dotsCount: _pages.length,
          position: _currentPage,
        ),
      ],
    );
  }
}

You can also drive DotsIndicator manually (no PageView), or let it drive navigation itself with onTap — see below.

Example

In these examples, pageLength is the total of dots to display and currentPage is the position to highlight (the active dot).

For information, currentPage is a double, to be able to have lerp animation.

A simple dots indicator

Simple dots

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
);
Custom colors

Custom dots colors

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    color: Colors.black87, // Inactive color
    activeColor: Colors.redAccent,
  ),
);
Use specific color for each dot

You can choose to have one color for inactive dots and one color the active dot.

But you can also define one color by inactive dots (colors) and one color by active dot (activeColors).

If you have a total of 3 dots, you must provide an array of 3 colors.

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    colors: [Colors.grey[300], Colors.grey[600], Colors.grey[900]], // Inactive dot colors
    activeColors: [Colors.red[300], Colors.red[600], Colors.red[900]], // Àctive dot colors
  ),
);
Custom size and shape

You can change the default size of dots and also shape.

So you can choose to have a shape for inactive dots and another shape for the active dot for example.
By default, the shape of dots are CircleBorder, so to have a rounded rectangle for active one, you need to change activeShape

Custom dots size

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    size: const Size.square(9.0),
    activeSize: const Size(18.0, 9.0),
    activeShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
  ),
);
Custom size for each dot

You can customize the size of each dot, for inactive and/or active dots.

For that, use sizes and/or activeSizes params.

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    sizes: [
      const Size.square(10.0),
      const Size.square(15.0),
      const Size.square(20.0),
    ],
    activeSizes: [
      const Size.square(25.0),
      const Size.square(25.0),
      const Size.square(35.0),
    ],
  ),
);
Custom shape

You can change the default shape of dots. By default it's a CircleBorder.

You can change the no active and active dot shape.

Custom dots shape

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    shape: const Border(),
    activeShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
  ),
);
Custom shape for each dot

You can customize the shape of each dot, for inactive and/or active dots.

For that, use shapes and/or activeShapes params.

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    shapes: [
      RoundedRectangleBorder(borderRadius: BorderRadius.circular(5.0)),
      RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.0)),
    ],
    activeShapes: [
      RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
      RoundedRectangleBorder(borderRadius: BorderRadius.circular(25.0)),
    ],
  ),
);
Change the space between dots

By default a dot have a margin of 6 pixels on his left and right. It's EdgeInsets.symmetric(horizontal: 6.0). But if you want you can change it, for example to increase the space between dots or to add top margin.

Custom dots space

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  decorator: DotsDecorator(
    spacing: const EdgeInsets.all(10.0),
  ),
);
Axis and reverse property

There is two other property, axis and reversed. Axis is to display dots indicator horizontally (default) or vertically. Also, you can set reversed: true to reverse the order of dots. (default: false).

For example, if you want to display the dots indicator vertically, but with the first dots on bottom : Set axis: Axis.vertical and reversed: true. Obviously, you can use reversed with Axis.horizontal.

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  axis: Axis.vertical,
  reversed: true,
);
onTap property

Add the onTap property to let users jump directly to a page by tapping its dot, instead of only reflecting the current page.

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  onTap: (index) {
    _pageController.animateToPage(
      index,
      duration: const Duration(milliseconds: 300),
      curve: Curves.ease,
    );
  },
);
Fade out the last dot (indefinite pager)

When dotsCount is large (or unknown), showing every dot isn't practical. Set fadeOutLastDot: true with a fadeOutDistance to only keep a window of dots fully visible around the current position, fading the rest out — and animate: true to transition smoothly as position changes.

DotsIndicator(
  dotsCount: pageLength,
  position: currentPage,
  fadeOutLastDot: true,
  fadeOutDistance: 2,
  animate: true,
);

카테고리

의존성

의존성 목록 1 개

소스 저장소

이 패키지를 사용하는 프로젝트