Flutter实例成员‘{0}’无法使用静态访问方式访问。

18
我正在Flutter中从一个活动传递变量到另一个活动,但是出现了错误“Instance member ‘latitude’ can’t be accessed using static access”,我需要将其转换为该块,以便我可以将其分配给静态URL。
class Xsecond extends StatefulWidget {
  final double latitude;
  final double longitude;
  Xsecond(this.latitude, this.longitude, {Key key}): super(key: key);

  @override
  _Xsecond createState() => _Xsecond();
}

class _Xsecond extends State<Xsecond> {
  static String lat = Xsecond.latitude.toString(); // Error: Instance member ‘latitude’ can’t be accessed using static access
  ...

跟随着

  ...
  String url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=${lat},$lng&radius=$radius&type=restaurant&key=$api';
  ...

@Morez 尝试过了。不幸的是,这并没有起作用,但将错误更改为“只有静态成员可以通过初始化器访问”。 - Mark
2个回答

14

在您的代码中,纬度和经度均被定义为非静态变量,即实例变量。这意味着它们只能使用类实例调用。

class _Xsecond extends State<Xsecond> {
      final xsecond = Xsecond();
      static String lat = xsecond.latitude.toString();
      ...

请阅读任何面向对象编程语言(例如Dart、Java、C++)的基础知识。

然而,在您的上下文中,第一个类是您的StatefullWidget。因此,您可以通过状态类的widget字段访问该类。

修复:

class _Xsecond extends State<Xsecond> {
          static String lat = widget.latitude.toString();
          ...

当我尝试这两个时,它们都没有起作用,但将错误更改为“只有静态成员可以由初始化器访问”。 - Mark
1
将代码移动到您的构建方法中。错误将消失。 - Sisir
1
将代码移动到build方法中,并将变量传递到上面类中的函数中,这样做有效了。谢谢! - Mark
5
“@Sisir“请阅读任何面向对象编程语言的基础知识,例如Dart、Java、C ++”--真的吗?你非得这么说吗?” - pedroremedios
5
哈,我也这么想!如果回复中只有“请阅读手册”之类的话,整个网站就没用了。更有帮助的回复是指向有用的文档。作为一名新开发者,我经常会花很多时间寻找文档,但却不成功,因为a)我不知道如何清晰地表达我的问题(适当搜索),b)不知道哪些资源有用,或c)手册过于技术性,或者期望我已经掌握了另一个基础层面的知识。 - Corey Stewart
1
话虽如此,您的实际解释在我的搜索中很有用。谢谢,Sisir。 - Corey Stewart

0

如果您使用非静态变量作为静态变量,就会出现此错误。让我们看一下这个例子:

class MyPage extends StatefulWidget {
  final foo = Foo();
  // ...
}

class _MyPageState extends State<MyPage> {
  final newFoo = MyPage.foo; // Error
  // ...
}

MyPage.foo 不是静态成员,但你却像它是一样使用了。


为了解决这个问题,你可以将变量设为static
static final foo = Foo();

或者

使用widget变量来获取底层变量。

class _MyPageState extends State<MyPage> {
  @override
  void initState() {
    super.initState();
    final newFoo = widget.foo; // No Error
  }
  // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接