Flutter:在无状态小部件中,我得到“无法在初始化程序中访问实例成员'xy'”在数组xy上使用长度时

问题描述

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

在一个无状态的子类中,我基于传递给该类的参数创建一个final。这样会抛出实例成员'parameters'在初始化器中无法访问。

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循环中使用变量)。但是,为什么基于参数的最终结果不起作用?这是一般设计还是我在做任何愚蠢的事情?

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

解决方法

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

如果出于某些原因需要成为类成员,则需要在构造函数中初始化它们,称为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);
,

它与调用构造函数时发生的事情的顺序有关。参数和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"),],),}  }
,

最终loopEnd = ...

创建一个类属性。它在对象初始化之前执行,因此您无法访问this(在这种情况下为this.noOfButtons),因为它可能尚未初始化。您可以改为在loopEnd方法内初始化build,然后完全创建对象。

顺便说一句,根据convention,您应该在UpperCamelCase中为该类命名,因此class CreateParameterButtons 而不是class createParameterButtons

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...