前提・実現したいこと
下記コードがあり、実現したいことが2点あります。
簡潔に説明するとPageViewウィジェットで横にスワイプできるものの中に、PageViewでさらに縦にスワイプできるようにしています。
これを縦にスワイプして別ページに遷移後、横にスワイプしてから反対方向にスワイプし、元のページに戻ると、一番上のページに戻ってしまいます。
横に3枚ページがあり、どれかをスワイプした際に、それぞれのページもリンクしてスワイプしている状態にしたいです。
例でいうと、LeftPageを下にスワイプし、TwoPageに遷移したら、その後左右にスワイプした場合、FivePage,EightPageに遷移するようにしたいです。
もう一点がPageViewの中でFutureBuilderを使用しているのですが、左右にスワイプした際に毎回再描画されないようにしたいです。(説明が正しいのかわからないので補足ですが、スワイプで切り替えた際に毎回非同期処理を行わないようにしたいです。)
発生している問題
・スワイプでページを切り替えた際、毎回再読み込みされてしまう。
・左右スワイプをして切り替えた際に、元のページの一番上のページに戻ってしまう。
該当のソースコード
dart
1import 'package:flutter/material.dart'; 2 3void main() { 4 runApp(new MyApp()); 5} 6 7class MyApp extends StatelessWidget { 8 9 Widget build(BuildContext context) { 10 return new MaterialApp( 11 title: 'Flutter Demo', 12 home: MyHome(), 13 debugShowCheckedModeBanner: false, 14 ); 15 } 16} 17 18class MyHome extends StatelessWidget { 19 20 Widget build(BuildContext context) { 21 return Scaffold( 22 appBar: AppBar( 23 title: Text("title"), 24 ), 25 body: PageView( 26 children: [ 27 LeftPage(), 28 CenterPage(), 29 RightPage(), 30 ], 31 ), 32 ); 33 } 34} 35 36class LeftPage extends StatelessWidget { 37 38 Widget build(BuildContext context) { 39 return FutureBuilder<Object>( 40 future: Future.delayed(const Duration(seconds: 2), () => 100), 41 builder: (context, snapshot) { 42 if (snapshot.hasData) { 43 return PageView( 44 scrollDirection: Axis.vertical, 45 children: [ 46 OnePage(), 47 TwoPage(), 48 ThreePage(), 49 ], 50 ); 51 } 52 53 return Center( 54 child: CircularProgressIndicator(), 55 ); 56 }); 57 } 58} 59 60class CenterPage extends StatelessWidget { 61 62 Widget build(BuildContext context) { 63 return FutureBuilder<Object>( 64 future: Future.delayed(const Duration(seconds: 2), () => 100), 65 builder: (context, snapshot) { 66 if (snapshot.hasData) { 67 return PageView( 68 scrollDirection: Axis.vertical, 69 children: [ 70 FourPage(), 71 FivePage(), 72 SixPage(), 73 ], 74 ); 75 } 76 77 return Center( 78 child: CircularProgressIndicator(), 79 ); 80 }); 81 } 82} 83 84class RightPage extends StatelessWidget { 85 86 Widget build(BuildContext context) { 87 return FutureBuilder<Object>( 88 future: Future.delayed(const Duration(seconds: 2), () => 100), 89 builder: (context, snapshot) { 90 if (snapshot.hasData) { 91 return PageView( 92 scrollDirection: Axis.vertical, 93 children: [ 94 SevenPage(), 95 EightPage(), 96 NinePage(), 97 ], 98 ); 99 } 100 return Center( 101 child: CircularProgressIndicator(), 102 ); 103 }); 104 } 105} 106 107class OnePage extends StatelessWidget { 108 109 Widget build(BuildContext context) { 110 return Center( 111 child: Text("one page"), 112 ); 113 } 114} 115 116class TwoPage extends StatelessWidget { 117 118 Widget build(BuildContext context) { 119 return Center( 120 child: Text("two page"), 121 ); 122 } 123} 124 125class ThreePage extends StatelessWidget { 126 127 Widget build(BuildContext context) { 128 return Center( 129 child: Text("three page"), 130 ); 131 } 132} 133 134class FourPage extends StatelessWidget { 135 136 Widget build(BuildContext context) { 137 return Center( 138 child: Text("four page"), 139 ); 140 } 141} 142 143class FivePage extends StatelessWidget { 144 145 Widget build(BuildContext context) { 146 return Center( 147 child: Text("five page"), 148 ); 149 } 150} 151 152class SixPage extends StatelessWidget { 153 154 Widget build(BuildContext context) { 155 return Center( 156 child: Text("six page"), 157 ); 158 } 159} 160 161class SevenPage extends StatelessWidget { 162 163 Widget build(BuildContext context) { 164 return Center( 165 child: Text("seven page"), 166 ); 167 } 168} 169 170class EightPage extends StatelessWidget { 171 172 Widget build(BuildContext context) { 173 return Center( 174 child: Text("eight page"), 175 ); 176 } 177} 178 179class NinePage extends StatelessWidget { 180 181 Widget build(BuildContext context) { 182 return Center( 183 child: Text("nine page"), 184 ); 185 } 186}
試したこと
下記方法と近いかなと思っていろいろ試したのですがうまくいきませんでした。
[https://qiita.com/umechanhika/items/a2aca1ead61045803a02]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/24 01:14