1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

初心者の壁⑨ childrenって中身が複数の時に使うんじゃなかったの???

1
Last updated at Posted at 2026-05-29

昨日は
「ChatGPTに頼らずコード修正チャレンジ」
に挑んで、
あえなく撃沈してしまいました。

その中でどうしても
「解せぬ!」
と思ったところがあったので
今日はその話をしてみようと思います。

問題のコードはここです。

subtitle: Padding(
    padding: const EdgeInsets.only(top: 6),
 child: Row(
    children: [

        Container(
            padding: const EdgeInsets.symmetric(
            horizontal: 10,
            vertical: 4,
            ),

            decoration: BoxDecoration(
            color: Colors.white.withOpacity(0.7),
            borderRadius:
            BorderRadius.circular(999),
            ),

            child: Text(
            '$paramCount params',

            style: const TextStyle(
                fontSize: 12,
                fontWeight: FontWeight.bold,
            ),
        ),
      ),
    ],
),

この中に
children:
ってあるじゃないですか。

これって、

中に入るものが複数ある時に使うんだよ

って
前にChatGPTが言ってたんですよ。

だから
Row()の中に
childrenが出てきた時点で、

Container()の他にも何か入っているはず!

って考えていました。

でも、そこから下をいくら探しても、
他に、Row()の中身は出てこない。

  • padding:
  • decoration:
  • child:

Container()の中の中身であって
Row()の中身ではないですよね。

それだったらchildでも良いのでは?

って思ったんですが、
childに変えるとエラーになるんです。
これがどうしても納得いきませんでした。

そもそも定義されていない

これが、basic.dartのRow()の定義部分です。

const Row({
    super.key,
    super.mainAxisAlignment,
    super.mainAxisSize,
    super.crossAxisAlignment,
    super.textDirection,
    super.verticalDirection,
    super.textBaseline, // NO DEFAULT: we don't know what the text's baseline should be
    super.spacing,
    super.children,
  }) 

ご覧の通りchildはどこにもありません。
Row()って、複数のWidgetを横に並べたりする時に使うものだから
中身は複数前提で作られております。
当たり前ですね。

逆にCenter()なんかは、
中に入るものがひとつだけの前提なので
childで受け取るようになっています。

つまり、上のコードって
複数のWidgetを渡す前提で入れ物を作ったけど
たまたまひとつしか入れなかった、ということでした。

そして、childrenは複数入れる用だけど
別にひとつでも問題ない、ということのようです。

英語のテストじゃないんだから

ここは中身がひとつだからchildでしょ!

なんて言ってもしょうがないんですよね。
とりあえずここまでは納得しました。

そもそもなんでRow()なの?

ここで新たな疑問が浮かんできます。

ひとつしか無いのなら、なぜRow()を使っているのか。
単純にContainer()を置くだけじゃダメなの?

結論から言うと
今回のコードでは
Row()は、無くても全く問題ありません
このように書き換えても、表示結果は同じだそうです。


subtitle: Padding(
  padding: const EdgeInsets.only(top: 6),

  child: Container(
    padding: const EdgeInsets.symmetric(
      horizontal: 10,
      vertical: 4,
    ),

    decoration: BoxDecoration(
      color: Colors.white.withOpacity(0.7),
      borderRadius: BorderRadius.circular(999),
    ),

    child: Text(
      '$paramCount params',

      style: const TextStyle(
        fontSize: 12,
        fontWeight: FontWeight.bold,
      ),
    ),
  ),
),

おそらく、プログラマー界隈の常識とか
後でWidgetを追加できるように、という親切設計とか
そんな理由でRow()を付けていただけなのではないでしょうか。

まとめ

さて、今回は
ちょっとおバカな勘違いの話でした。

今回のコードも、私が自分で考えて書いたわけでなく
ChatGPTの提示したものをそのまま貼っていたものです。

何も知らない私が、「childrenは複数」という知識しか持たずに
玄人向けのコードを読もうとしたものだから
混乱してしまった、というわけです。

やりとりの中で、ChatGPTが描いてくれた説明図が
とても分かりやすかったので
貼っておきます。

名詞の複数とか単数とかをあまり気にしない日本人としては

それだったら
全部childrenでいんじゃね?

ってなりますが
きっとこの仕様には意味があるんでしょうね。

ChatGPT Image 2026年5月29日 08_07_57.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?