为什么 Flutter 在 children[] 小部件中使用文本按钮时需要有 "child: null" 行代码?

Why does Flutter need to have a "child: null" line of code when text button is used in a children[] widget?

Flutter 新手。我目前正在学习一个 flutter 课程,在该课程中我练习添加包以通过构建木琴来播放声音。当为每个声音文件添加多个按钮时,flutter 告诉我 “参数 'child' 是必需的” 并让我将它插入到带有 null [= 的 TextButton 的末尾23=]。代码在没有它的情况下工作正常,但飞镖分析一直给我警告。插入下面列出的 child 后的示例代码。

 children: [
                TextButton(
                  onPressed: () {
                    final player = AudioCache();
                    player.play('note1.wav');
                  },
                  style: ButtonStyle(
                    backgroundColor: MaterialStateProperty.all<Color>(Colors.red),
                  ), child: null,

我似乎无法找到为什么这会警告我,但阅读文档看起来可能是因为它期待文本按钮的文本?任何人都可以解释或指出为什么这样做吗?

提前致谢。

编辑

正如用户@Saddan 所说,TextButton class 包含框约束,这意味着即使没有 child.

它仍然有一个大小

你需要 child 小部件的真正原因有点无聊:你想要 TextWidget 而没有 child 的原因很少,并且即使你这样做了,正如我稍后在回答中提到的那样,更常见的方法是使用 Container,它可以理解为一个空的小部件,因此,child 属性 在文本小部件上被视为 required(使用 null-safety,您会收到 compile-time 错误,如果没有它,您会收到问题中的 lint 警告)。

自动添加child: null的原因是flutter不知道你想要什么作为你的TextButton的child,但我相信你是为了取代null 与其他任何东西。

原始答案

A TextButton 应该总是有一个 child 因为如果没有它就不会显示任何东西,文本按钮不能自己调整大小所以它总是和它的大小一样child,你需要在child 属性 上放一些东西,否则文本按钮将不知道是什么样子。

现在,你将 null 作为 child 传递,我不得不承认,我认为这是不可能的,我也不认为 flutter 很喜欢这个想法(如果激活 null-safety,此代码将抛出 compile-time 错误)。我认为您应该改用 Container,这是一个 empty-by-default 小部件作为 child 属性:

TextButton(
  onPressed: () {
    final player = AudioCache();
    player.play('note1.wav');
  },
  style: ButtonStyle(
    backgroundColor: MaterialStateProperty.all<Color>(Colors.red),
  ),
  child: Container(),

如果需要,您还可以使用具有某种颜色、某种宽度或某种高度的容器:

Container(
  color: Colors.red,
  width: 20,
  height: 20,
);

你的假设很正确。它期待一个 Widget ,如果具体它期待一个 TextWidget 考虑你的按钮的标签或名称。可能您使用的是旧版本的 flutter 框架,因此它接受 child 的 null 值,但是当我使用 2.5.3 它不接受 null 值时,您必须提供它。