実現したいこと
ウォークスルー画面を作りたいと思っていて、最後のページになったらボタンのonTappedの処理を変えたり、ボタンのテキストを変えたりしたいです。
今試していることは、下の画像でのNextボタンがPageView
の最後のページ(3ページ目)では非活性もしくは別のボタンに切り替えられるかどうかということです。
試したこと
PageController
のpage
プロパティを参照しページ数と比較してボタンをコントロールしてみましたが上手く行きませんでした。
ソースコード
WaldThroughPage
1class WalkThroughPage extends StatefulWidget { 2 @override 3 _WalkThroughPageState createState() => _WalkThroughPageState(); 4} 5 6class _WalkThroughPageState extends State<WalkThroughPage> { 7 final _controller = PageController(); 8 9 static const _kDuration = const Duration(milliseconds: 300); 10 static const _kCurve = Curves.ease; 11 12 final List<Widget> _pages = [ 13 Center( 14 child: Text('Page1'), 15 ), 16 Center( 17 child: Text('Page2'), 18 ), 19 Center( 20 child: Text('Page3'), 21 ), 22 ]; 23 24 @override 25 Widget build(BuildContext context) { 26 final _size = MediaQuery.of(context).size; 27 28 return Scaffold( 29 body: Center( 30 child: Column( 31 mainAxisAlignment: MainAxisAlignment.center, 32 children: [ 33 Container( 34 height: _size.height * 0.8, 35 child: PageView.builder( 36 controller: _controller, 37 itemBuilder: (context, index) { 38 return _pages[index % _pages.length]; 39 }), 40 ), 41 Row( 42 children: [ 43 RaisedButton( 44 onPressed: () { 45 _controller.previousPage( 46 duration: _kDuration, curve: _kCurve); 47 }, 48 child: Text('Back')), 49 Spacer(), 50 Container( 51 child: Center( 52 child: DotsIndicator( 53 controller: _controller, 54 itemCount: _pages.length, 55 onPageSelected: (int page) { 56 _controller.animateToPage(page, 57 duration: _kDuration, curve: _kCurve); 58 }, 59 ), 60 ), 61 ), 62 Spacer(), 63 _controller.page == _pages.length 64 ? RaisedButton( 65 onPressed: null, 66 child: Text('Next'), 67 ) 68 : RaisedButton( 69 onPressed: () => _controller.nextPage( 70 duration: _kDuration, curve: _kCurve), 71 child: Text('Next')), 72 ], 73 ), 74 ], 75 ), 76 ), 77 ); 78 } 79}
DotsIndicator
1class DotsIndicator extends AnimatedWidget { 2 DotsIndicator( 3 {this.controller, 4 this.itemCount, 5 this.onPageSelected, 6 this.color: Colors.grey}) 7 : super(listenable: controller); 8 9 final PageController controller; 10 final int itemCount; 11 final ValueChanged<int> onPageSelected; 12 final Color color; 13 static const double _kDotSize = 8.0; 14 static const double _kMaxZoom = 2.0; 15 static const double _kDotSpacing = 25.0; 16 17 Widget _buildDot(int index) { 18 double selectedness = Curves.easeOut.transform(max( 19 0.0, 20 1.0 - 21 ((controller.page ?? controller.initialPage) % itemCount - index) 22 .abs())); 23 double zoom = 1.0 + (_kMaxZoom - 1.0) * selectedness; 24 return Container( 25 width: _kDotSpacing, 26 child: Center( 27 child: Material( 28 color: color, 29 type: MaterialType.circle, 30 child: Container( 31 width: _kDotSize * zoom, 32 height: _kDotSize * zoom, 33 child: InkWell( 34 onTap: () => onPageSelected(index), 35 ), 36 ), 37 ), 38 ), 39 ); 40 } 41 42 @override 43 Widget build(BuildContext context) { 44 return Row( 45 mainAxisAlignment: MainAxisAlignment.center, 46 children: List<Widget>.generate(itemCount, _buildDot), 47 ); 48 } 49}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。