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