Flutter:在无状态小部件中,在数组 xy 上使用长度时我得到 "The instance member 'xy' can't be accessed in an initializer."

Flutter: In stateless widget I get "The instance member 'xy' can't be accessed in an initializer." when using length on array xy

现在这是我遇到此问题的代码中的第二个位置(第一个仍然悬而未决,因为我认为它可能是由其他原因引起的)

在 child 无状态 class 中,我根据传递给此 class 的参数创建了一个 final。这会抛出 The instance member 'parameters' can't be accessed in an initializer.

class createParameterButtons extends StatelessWidget {
  final List<Parameter> parameters;
  final String unnknown;
  createParameterButtons({this.parameters, this.unnknown});
  final noOfButtons = parameters.length;
  final loopEnd = (noOfButtons / 7).truncate() + (noOfButtons % 7 < 5 ? 1 : 2);
  @override
  Widget build(BuildContext context) {
    return Column(children: <Widget>[
      Text("a"),
    ],
    ),
}  }

我猜我发现我不能在无状态小部件中使用变量(尽管我可以在 for 循环中使用变量)。但是为什么基于参数的 final 不起作用呢?这是通用设计还是我在做什么蠢事?

我知道,作为解决方法,我可以将数组长度作为另一个参数发送。但我想了解问题。

final loopEnd = ...

创建 class 属性。它在对象初始化之前执行,因此您无法访问 this(或本例中的 this.noOfButtons),因为它可能尚未初始化。您可以在 build 方法中初始化 loopEnd,然后完全创建对象。

顺便说一句,根据 convention 你应该用 UpperCamelCase 命名 class,所以 class CreateParameterButtons 而不是 class createParameterButtons

这与调用构造函数时发生的事情的顺序有关。 parameters 和 noOfButtons 都是字段,一个不一定先于另一个分配。如果你想在其他最终字段中使用字段,你必须在初始化列表中进行。 https://dart.dev/guides/language/language-tour#initializer-list.

所以,这应该有效:

class createParameterButtons extends StatelessWidget {
  final List<Parameter> parameters;
  final String unnknown;
  createParameterButtons({this.parameters, this.unnknown}) : noOfButtons = parameters.length, loopEnd = loopEnd = (noOfButtons / 7).truncate() + (noOfButtons % 7 < 5 ? 1 : 2);
  final noOfButtons;
  final loopEnd;
  @override
  Widget build(BuildContext context) {
    return Column(children: <Widget>[
      Text("a"),
    ],
    ),
}  }

您可以将变量设为构建方法的局部变量。

如果由于某种原因它们需要成为class成员,您需要在构造函数中初始化它们,这称为initializer list:

class createParameterButtons extends StatelessWidget {
  final List<Parameter> parameters;
  final String unknown;
  final int noOfButtons;
  final int loopEnd;

  createParameterButtons({this.parameters, this.unknown})
  : noOfButtons = parameters.length,
    loopEnd = (parameters.length / 7).truncate() + (parameters.length % 7 < 5 ? 1 : 2);