昨日は
「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でいんじゃね?
ってなりますが
きっとこの仕様には意味があるんでしょうね。
