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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Dart

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

Q&A

解決済

1回答

640閲覧

Flutter 無限リスト作成についてサンプルコードの意味が分からないため理解したい

KentarouHayashi

総合スコア23

Flutter

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Dart

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

0グッド

0クリップ

投稿2022/07/30 23:05

編集2022/07/30 23:08

前提

Flutterのサンプルコードを使用してFlutterの勉強をしているFlutter初心者です。
無限リスト作成にて動作がよくわからない箇所があります。

実現したいこと

Flutterの無限リストのサンプルコードを理解したい

発生している問題・エラーメッセージ

描画のタイミングが12個の英単語をリストに登録後に10個の英単語を一気に画面に描画しているようでした。
ListView.builderにてitemCountをしていない場合、12個のデータでリストを作成するという仕様なのでしょうか。
また、itemCountで「5」を指定してみたのですが、画面に描画されたのは3個でした。
画面上に表示されるのがリストの数より2個足らないのですがこの辺の制御がどこで行われているのかわからない状態です。
この辺の挙動についてご教示いただけますと幸いです。

また以下の書き方についても教えてください。
これはreturn _buildRow(_suggestions[index]);で呼び出されpairに代入。
WordPairはasPascalCaseを使用するために必要という感じでしょうか。
(プログラミング自体あまりやってなく、構文等わからず、調べてもこの辺の記載方法が何を指しているのかなどわからず。。。)

Dart

1Widget _buildRow(WordPair pair)

該当のソースコード

Dart

1import 'package:flutter/material.dart'; 2import 'package:english_words/english_words.dart'; 3 4void main() => runApp(MyApp()); 5 6class MyApp extends StatelessWidget { 7 8 Widget build(BuildContext context) { 9 return MaterialApp( 10 title: 'Startup Name Generator', 11 home: RandomWords() 12 ); 13 } 14} 15 16class RandomWordsState extends State<RandomWords> { 17 final _suggestions = <WordPair>[]; 18 final _biggerFont = const TextStyle(fontSize: 18.0); 19 20 Widget build(BuildContext context) { 21 return Scaffold( 22 appBar: AppBar( 23 title: Text('Startup Name Generator'), 24 ), 25 body: _buildSuggestions(), //Widget _buildSuggestions()で作成したウィジェット 26 ); 27 } 28 Widget _buildSuggestions() { //_buildSuggestionsというウィジェットを作成する 29 return ListView.builder( //itemBuilderプロパティで返すWidgetを複数作成するWidget 30 padding: const EdgeInsets.all(15.0),//余白の設定。all以外はonly(top,right,bottom,left),symmetry(horizontal,vertical) 31 itemBuilder: (context, i) {//contextは画面表示内容を生成するために必要なもの。iは0から始まり、呼び出されるたびに加算。 32 33 if (i.isOdd) return Divider();//iが奇数だった場合に罫線を入れる 34 final index = i ~/ 2; //~を入れることで整数を返す 35 if (index >= _suggestions.length) { 36 _suggestions.addAll(generateWordPairs().take(10)); 37 } 38 return _buildRow(_suggestions[index]); 39 }); 40 } 41 Widget _buildRow(WordPair pair) { 42 return ListTile( 43 title: Text( 44 pair.asPascalCase, 45 style: _biggerFont, 46 ), 47 ); 48 } 49} 50 51class RandomWords extends StatefulWidget { 52 53 RandomWordsState createState() => new RandomWordsState(); 54}

試したこと

ブレイクポイントにてリスト登録事に動作を止めてどのタイミングで画面に描画されるのかを確認しました。

補足情報(FW/ツールのバージョンなど)

OS:Windows11
IDE:Android Studio
Flutter 3.0.4
english_words-4.0.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず使用するAPIのヘルプは読みましょう。

https://api.flutter.dev/flutter/widgets/ListView/ListView.builder.html

これによると、表示対象となるアイテムのみビルダーが呼び出されるとのことです。

This constructor is appropriate for list views with a large (or infinite) number of children because the builder is called only for those children that are actually visible.
このコンストラクタは、実際に表示されている子供たちに対してのみビルダが呼び出されるため、大きな(あるいは無限の)数の子供を持つリストビューに適しています。

なので12個というのは、作られた画面に表示可能な個数なのでしょう。
この数は、ListViewの縦の大きさに依存するので、画面が大きければもっと多く(私のだと34でした)のiの値で呼び出されます。
またスクロールすることでiの値はいろいろ変わります。これはスクロールしたことで空いたスペースにデータを表示する必要があり、その位置の番号がiで指定されたという意味になります。

この値はitemBuilderのしょっぱなにdebugPrint("index $i");を入れて初期表示やスクロールした際にどのような値で呼び出されるか確認したほうが良いでしょう。

次に「itemCountで「5」を指定してみたのですが、画面に描画されたのは3個でした。」の件。
ビルダー内で、iが奇数の時に罫線を入れてます。
そのため実際に単語が表示されるのはiが0,2,4の3回のみです。
まさしく実装通りの動きをしています。
ちなみにitemCountはitemBuilderで呼び出される際のiが許容する範囲です。この場合iは0~4の値しか来ません。

最後に_buildRowの件。
一応その認識で合ってはいます。

実際には以下の様な意味合いです。
_suggestionsはWordPairクラスをListで保持している変数。
return _buildRow(_suggestions[index])は、_suggestionsのindexで示される場所に設定されているWordPairデータを_buildRowに渡し、その中でListTileウィジェット作成しを返す。ListTileはTextを含みそのTextの文字列としてWordPairデータのasPascalCaseを使用している。

最後に
flutterで使われているDat言語の簡易説明は https://dart.dev/guides/language/language-tour に掲載されています。
英語ですがブラウザの日本語翻訳機能を使えばある程度の意味は理解できると思います。

投稿2022/07/31 01:00

ta.fu

総合スコア1667

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

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

KentarouHayashi

2022/07/31 05:46

ご回答ありがとうございます。 理解いたしました!!!また、参考となるURLまで送っていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問