1. 程式人生 > 實用技巧 >Flutter 仿iOS自定義UIPageControl元件

Flutter 仿iOS自定義UIPageControl元件

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class DWPageView extends StatefulWidget {
DWPageView({
// 寬度 必傳
this.width,
// 高度 必傳
this.height,
// 總頁數 必傳
this.numberOfPages,
// 當前頁數
this.currentPage = 0,
// 未選顏色 預設灰色
this.pageColor = Colors.grey,
// 選中顏色 預設白色
this.tintColor = Colors.white,
// 間隔 預設5
this.space = 5,
// 指示器寬度 預設5
this.pageWidth = 5,
// 指示器高度 預設5
this.pageHeight = 5,
// 選中指示器寬度 預設5
this.currentPageWidth = 5,
// 選中指示器高度 預設5
this.currentPageHeight = 5,
// 指示器圓角度 預設2
this.radius = 2,
// 排序的方向 預設橫著排序
this.scrollDirection = Axis.horizontal,

Key key,
}) : super( key: key);

final int numberOfPages;
final int currentPage;
final Color pageColor;
final Color tintColor;
final double space;
final double width;
final double height;
final double pageWidth;
final double pageHeight;
final double currentPageWidth;
final double currentPageHeight;
final double radius;
final Axis scrollDirection;

@override
DWPageViewState createState() {
return DWPageViewState();
}

}

class DWPageViewState extends State<DWPageView> {
ScrollController _scrollController = new ScrollController();
int _currentPage;

@override
void initState() {
// TODO: implement initState
super.initState();
setState(() {
_currentPage = widget.currentPage;
});
}

void selectedIndex(int index) {
setState(() {
_currentPage = index;
});
}

@override
Widget build(BuildContext context) {
// TODO: implement build
return Container(
width: widget.width,
height: widget.height,
child: ListView.builder(
controller: _scrollController,
scrollDirection: widget.scrollDirection,
itemCount: widget.numberOfPages,
itemBuilder: ((context, index) {
if (index == _currentPage) {
return Center(
child: Container(
margin: new EdgeInsets.fromLTRB(0, 0, widget.scrollDirection == Axis.horizontal ? widget.space : 0, widget.scrollDirection != Axis.horizontal ? widget.space : 0),
width: widget.currentPageWidth,
height: widget.currentPageHeight,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(widget.radius)),
color: widget.tintColor,
),
),
);
}
return Center(
child: Container(
margin: new EdgeInsets.fromLTRB(0, 0, widget.scrollDirection == Axis.horizontal ? widget.space : 0, widget.scrollDirection != Axis.horizontal ? widget.space : 0),
width: widget.pageWidth,
height: widget.pageHeight,
decoration: BoxDecoration(
color: widget.pageColor,
borderRadius: BorderRadius.all(Radius.circular(widget.radius)),
),
),
);
}),
),
);
}
}