如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。