#実現したいこと
動画のように、SingleChildScrollView内でListViewを使い、全画面でスクロールしたいです。
(ListViewはスクロールされず固定で、画面全体をスクロースしたい)
動画を見るとできてるかのように見えますが、なぜか一番最後のCard
の下途切れております。。。
これを解消したいです!
動画はこちらを参考に
#該当のソース
MyPageScreen>MyPageMovies>MyPageMovieCard
というようにネストされています。
・MyPageScreen→画面全体
・MyPageMovies→映画一覧を表示させるWidget
・MyPageMovieCard→映画のCard1つ1つ
こんな感じです。
※APIから値を取得したりしている部分は省きます
##MyPageScreen
dart
1class MyPageScreen extends StatelessWidget { 2 3 4 Widget build(BuildContext context) { 5 SizeConfig().init(context); 6 return Scaffold( 7 body: SingleChildScrollView( 8 child: Container( 9 // ここでheightを指定しないとエラーになる 10 height: MediaQuery.of(context).size.height, 11 padding: const EdgeInsets.all(30), 12 child: Column( 13 children: <Widget>[ 14 // MyPageView(), 関係ないため除外 15 Padding( 16 padding: EdgeInsets.only( 17 top: 3 * SizeConfig.blockSizeVertical, 18 bottom: 3 * SizeConfig.blockSizeVertical, 19 ), 20 child: Text( 21 'My Movies', 22 style: Theme.of(context).textTheme.headline6, 23 ), 24 ), 25 MyPageMovies(), 26 ], 27 ), 28 ), 29 ), 30 ); 31 } 32}
SingleChildScrollView
直下にあるContainer
で高さを指定しないと壮大なエラーに遭遇します。。
console
1RenderFlex children have non-zero flex but incoming height constraints are unbounded. 2// 省略 3Updated layout information required for _RenderScrollSemantics#fe738 NEEDS-LAYOUT NEEDS-PAINT to calculate semantics. 4'package:flutter/src/rendering/object.dart': 5Failed assertion: line 2658 pos 12: '!_needsLayout'
##MyPageMovies
dart
1class MyPageMovies extends StatelessWidget { 2 3 4 Widget build(BuildContext context) { 5 final userId = _firebaseAuth.currentUser.uid; 6 return StreamBuilder<QuerySnapshot>( 7 stream: _firestore.collection('users/${userId}/movies').snapshots(), 8 builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) { 9 if (snapshot.hasError) { 10 return Center( 11 child: Text(snapshot.error), 12 ); 13 } 14 if (snapshot.hasData) { 15 return Expanded( 16 child: ListView.builder( 17 itemCount: snapshot.data.docs.length, 18 shrinkWrap: true, 19 physics: NeverScrollableScrollPhysics(), 20 itemBuilder: (BuildContext context, int index) { 21 return Column( 22 children: <Widget>[ 23 MyPageMovieCard( 24 snapshot.data.docs[index].data()['id'], 25 snapshot.data.docs[index].data()['title'], 26 ), 27 ], 28 ); 29 }, 30 ), 31 ); 32 } 33 return Center(child: CircularProgressIndicator()); 34 }); 35 } 36}
ListView.builder
でスクロールさせないために、下記2つを追加。
dart
1shrinkWrap: true, 2physics: NeverScrollableScrollPhysics(),
##MyPageMovieCard
dart
1class MyPageMovieCard extends StatelessWidget { 2 final int id; 3 final String title; 4 5 MyPageMovieCard(this.id, this.title); 6 7 8 Widget build(BuildContext context) { 9 return FutureBuilder( 10 future: getMyMovie(), 11 builder: (BuildContext context, AsyncSnapshot snapshot) { 12 if (snapshot.hasError) { 13 return Center( 14 child: Text(snapshot.error), 15 ); 16 } 17 if (snapshot.hasData) { 18 final posterPath = snapshot.data['poster_path']; 19 return InkWell( 20 borderRadius: BorderRadius.circular(10), 21 child: Card( 22 shape: RoundedRectangleBorder( 23 borderRadius: BorderRadius.circular(20)), 24 clipBehavior: Clip.antiAliasWithSaveLayer, 25 child: Row( 26 children: <Widget>[ 27 Image.network( 28 'https://image.tmdb.org/t/p/w154/${posterPath}', 29 ), 30 Expanded( 31 child: Container( 32 padding: const EdgeInsets.all(10), 33 child: Container( 34 width: double.infinity, 35 child: Text( 36 title, 37 style: Theme.of(context).textTheme.headline6, 38 textAlign: TextAlign.left, 39 ), 40 ), 41 ), 42 ), 43 ], 44 ), 45 ), 46 ); 47 } 48 return Center(child: CircularProgressIndicator()); 49 }); 50 } 51}
自分で試したこと
##ListViewをスクロール可能にする
dart:MyPageMovies
1return Expanded( 2 child: ListView.builder( 3 itemCount: snapshot.data.docs.length, 4 // shrinkWrap: true, 5 // physics: NeverScrollableScrollPhysics(), 6 itemBuilder: (BuildContext context, int index) { 7 return Column(
こうすると最後までCard
が途切れることなく表示されます。
でもこれだとSingleChildScrollView
でもスクロールできて、ListView
でもスクロールできてしまうので、、、。
##LayoutBuilderを使用
https://stackoverflow.com/questions/56326005/how-to-use-expanded-in-singlechildscrollview
????を参考に下記のコードを試しましたが、全く同じエラーでダメでした。。。
dart
1class MyPageScreen extends StatelessWidget { 2 3 4 Widget build(BuildContext context) { 5 SizeConfig().init(context); 6 return Scaffold( 7 body: LayoutBuilder( 8 builder: (context, constraints) => SingleChildScrollView( 9 child: ConstrainedBox( 10 constraints: BoxConstraints(minHeight: constraints.maxHeight), 11 child: IntrinsicHeight( 12 child: Column( 13 children: <Widget>[ 14 // MyPageView(), 15 Padding( 16 padding: EdgeInsets.only( 17 top: 3 * SizeConfig.blockSizeVertical, 18 bottom: 3 * SizeConfig.blockSizeVertical, 19 ), 20 child: Text( 21 'My Movies', 22 style: Theme.of(context).textTheme.headline6, 23 ), 24 ), 25 MyPageMovies(), 26 ], 27 ), 28 ), 29 ), 30 ), 31 ), 32 ); 33 } 34}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/07 12:59
退会済みユーザー
2021/06/07 14:53
2021/06/10 12:07