Flutter:未定义的名称尝试将名称更正为已定义的名称,或定义名称

时间:2020-05-17 17:49:31

标签: flutter dart

我在Flutter面前遇到了一些奇怪的问题。我对Flutter的了解很少。我正在学习。

class ViewOtherProfile extends StatefulWidget {
  final String userName;
  final int points;

  const ViewOtherProfile({
    @required this.userName,
    @required this.points,
  });

您可以看到我正在获取userName和Points数据作为参数。 我想在页面中打印此参数。像这样

class _ViewOtherProfileState extends State<ViewOtherProfile> {
..........

void initState(){ 
print(points);

     deviceInfo();
    super.initState();
     print(userName);
    ]);
   } 
    ............   

现在的问题是我遇到了错误。

Undefined name 'userName'.
Try correcting the name to one that is defined, or defining the name.

出现此错误以及如何解决该错误的任何原因。

感谢@jamesdlin

我试图这样说

print(ViewOtherProfile.userName); 

但是现在我又遇到另一个错误。

Instance member 'userName' can't be accessed using static access.

1 个答案:

答案 0 :(得分:0)

Flutter中有两种主要类型的小部件。 StatelessWidgetStatefullWidget。 StatelessWidget仅在构建UI时构建,并且永远不会重建。同时,如果调用setState,则每次都可以重建StatefulWidget。

因此,对于StatefulWiget,需要通过使用State类扩展主类来跟踪类的状态。

您必须注意,这两种类型的小部件中变量的范围可能有所不同。例如...

class ExampleStateless extends StatelessWidget {

    final String userName;
    final int points; 

   const ExampleStateless({
    @required this.userName,
    @required this.points,
   });

   @override
   Widget build(BuildContext context){
      print(userName); print(points);  

      return Something();
   }
}

请注意,对于有状态窗口小部件,有两个类,每个类都有其范围。超类ExampleStateful可以通过_ExampleStatefulState

与其子类widget共享范围。
class ExampleStateful extends StatefulWidget {
    final String userName;
    final int points; 
    Static final string id = "exampleState"; 

   const ExampleStatefull({
    @required this.userName,
    @required this.points,
   });
   // scope 1 
 @override
  _ExampleStatefulState createState() => _ExampleStatefulState();
}

class _ExampleStatefulState extends State<ExampleStateful>{
  // scope 2 

 final String userName2 = null;

@override
void initState(){
   super.initState();
   print(widget.userName);
   print(userName2);
   print(ExampleStateful.id);  // you can do this only if variable is static. 
 }
}

可以通过小部件属性在范围2中访问范围1中的内容。例如print(widget.userName);而不是print(userName);