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

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

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

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Dart

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

Q&A

解決済

1回答

4850閲覧

Flutter SingleChildScrollView内でListViewを使い、全画面でスクロールしたい

Gento

総合スコア77

Flutter

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Dart

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

0グッド

0クリップ

投稿2021/06/06 14:20

編集2021/06/07 12:52

#実現したいこと
動画のように、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でもスクロールできてしまうので、、、。

1

##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}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ListView.builder は画面に表示されている周辺を徐々に描画するので physics: NeverScrollableScrollPhysics() の設定によって描画が初期状態で止まっています。

一方 SingleChildScrollView のスクロールはこの場合 ListView.builder 以外の部分のスクロールを担当しています。

そのため最後の映画だけ中途半端な描画となり、スクロールしても表示されない状況になっていると思われます。

SingleChildScrollView と ListView.builder > physics: NeverScrollableScrollPhysics() を消してはどうでしょうか。

スクロールバーの位置が内側になるのを避けたいのでしたら、Scaffold > Container の Paddingを消して ListView.builder > Column を Padding で囲むのはどうでしょうか。

dart

1return Container( 2 // SingleChildScrollView を削除 3 height: MediaQuery.of(context).size.height, 4 // padding: const EdgeInsets.all(30), 5 child: Column( 6 children: [ 7 Padding( 8 padding: EdgeInsets.only( 9 top: 3, 10 bottom: 3, 11 ), 12 child: Text( 13 'My Movies', 14 style: Theme.of(context).textTheme.headline6, 15 ), 16 ), 17 Expanded( 18 child: ListView.builder( 19 itemCount: movies.length, 20 // shrinkWrap: true, 21 // physics: NeverScrollableScrollPhysics(), 22 itemBuilder: (context, index) { 23 return Padding( 24 // 追加 25 padding: const EdgeInsets.all(30), 26 child: Column( 27 children: <Widget>[ 28 for (var movie in movies) 29 Card( 30 shape: RoundedRectangleBorder( 31 borderRadius: BorderRadius.circular(20), 32 ), 33 clipBehavior: Clip.antiAliasWithSaveLayer, 34 child: Row( 35 children: [ 36 Image.network( 37 movie.fullImageUrl, 38 fit: BoxFit.cover, 39 width: 200, 40 height: 300, 41 ), 42 Expanded( 43 child: Container( 44 padding: const EdgeInsets.all(10), 45 child: Container( 46 width: double.infinity, 47 child: Text( 48 movie.title, 49 style: Theme.of(context) 50 .textTheme 51 .headline6, 52 textAlign: TextAlign.left, 53 ), 54 ), 55 ), 56 ), 57 ], 58 ), 59 ), 60 ], 61 ), 62 ); 63 }, 64 ), 65 ), 66 ], 67 ), 68 );

投稿2021/06/07 02:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Gento

2021/06/07 12:59

・SingleChildScrollView ・ListView.builder > physics: NeverScrollableScrollPhysics() 上記2つを削除すると確かにCardが途切れると言う現象は無くなりましたが、これだとListView.builderの部分だけがスクロール可能になります。。。 実現したい事としては「画面全体でスクロール可能で、かつListView.builderの部分はスクロールさせない」と言う動作です。。。
退会済みユーザー

退会済みユーザー

2021/06/07 14:53

SingleChildScrollViewによる「画面全体スクロール」でCardの内容を全て描画させたいということであれば、NeverScrollableScrollPhysics()である限りできないと思います。Cardをlazy描画しているのはListView.builderですので。 実現されたい内容だと、Card は lazy描画でない通常の方法で描画しておくしかないと思います。
Gento

2021/06/10 12:07

なるほど、そういうことでしたか! >Card は lazy描画でない通常の方法で描画しておくしかないと思います。 ListView.builderを使わない方法を模索するのが良さそうですね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問