Skip to content

Instantly share code, notes, and snippets.

@black-dragon74
Created April 19, 2020 13:43
Show Gist options
  • Save black-dragon74/69a860debed2dacaad816452aa36c789 to your computer and use it in GitHub Desktop.
Save black-dragon74/69a860debed2dacaad816452aa36c789 to your computer and use it in GitHub Desktop.
A companion widget to PageView in Flutter that provides iOS style page indicators and also provide scroll on tap.
//
// Code is poetry
//
// Created by Nick aka black-dragon74
//
import 'dart:math';
import 'package:flutter/material.dart';
class PageViewIndicator extends AnimatedWidget {
final PageController pageController;
final Color indicatorColor;
final int itemCount;
final ValueChanged<int> onPageChanged;
PageViewIndicator({
@required this.pageController,
@required this.itemCount,
@required this.onPageChanged,
this.indicatorColor: Colors.white,
}) : assert(indicatorColor != null),
super(listenable: pageController);
final double _dotSpacing = 25.0;
final double _maxZoom = 2.0;
final double _dotSize = 8.0;
Widget _generateDot(int index) {
double selectedness = Curves.easeInOut.transform(max(
0.0,
1.0 -
((pageController.page ?? pageController.initialPage) - index)
.abs()));
double zoom = 1.0 + (_maxZoom - 1.0) * selectedness;
return Container(
width: _dotSpacing,
height: _dotSize * _maxZoom,
child: Center(
child: Material(
type: MaterialType.circle,
color: indicatorColor,
child: Container(
height: _dotSize * zoom,
width: _dotSize * zoom,
child: InkWell(
onTap: () => onPageChanged(index),
),
),
),
),
);
}
@override
Widget build(BuildContext context) {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List<Widget>.generate(itemCount, _generateDot),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment