質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

7191閲覧

【Flutter】PageViewの現在のページ番号によるコントロール

toshi_ki

総合スコア17

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/10/11 08:15

編集2020/10/12 02:54

実現したいこと

ウォークスルー画面を作りたいと思っていて、最後のページになったらボタンのonTappedの処理を変えたり、ボタンのテキストを変えたりしたいです。
今試していることは、下の画像でのNextボタンがPageViewの最後のページ(3ページ目)では非活性もしくは別のボタンに切り替えられるかどうかということです。

サンプル画像

試したこと

PageControllerpageプロパティを参照しページ数と比較してボタンをコントロールしてみましたが上手く行きませんでした。

ソースコード

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

単純なことでしたが、StateWidget内に_currentPageなどStateとして値を保持しておき、 PageViewonPageChangedに渡すメソッド内でsetState_currentPageに現在のページを代入すればOKでした。

以下コードです。

int _currentPage = 0; ... PageView.builder( controller: _controller, onPageChanged: (int page) { setState(() { _currentPage = page; }); }, itemBuilder: (context, index) { return _pages[index % _pages.length]; }), ... _currentPage == _pages.length - 1 ? RaisedButton( onPressed: null, child: Text('Finish'), ) : RaisedButton( onPressed: () => _controller.nextPage( duration: _kDuration, curve: _kCurve), child: Text('Next')),

投稿2020/10/12 09:44

toshi_ki

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問