如何从一个对象的实例访问它的静态常量?

时间:2019-12-09 21:04:51

标签: class flutter dart

我有一个对象,该对象具有static constant,需要从其实例访问。

class ChatsScreen extends StatefulWidget {
  var arguments;
  static const name = ADatas.chatRoute;

  ChatsScreen(this.arguments);

  createState() => ChatsScreenState();
}

在上述类的State对象中,我想调用static const name。上面的类的State对象的代码:

class ChatsScreenState extends State<ChatsScreen> with RouteHelper{
  String userName = "";

  var textEditingController = TextEditingController();

  @override
  void initState() {
    getRouteName(widget); //=> as I understand and see on the VSCode, its the ChatsScreen object. 
    super.initState();
  }
}

我正在尝试实现一个接口,因此在编写该接口时我不知道实际的类名。而且我认为,如果我知道它的实际类别,就可以达到其静态常数。我写了这样的东西,但似乎不可能。我想我有个误会。

class RouteHelper{
  String getRouteName(dynamic instance){
    if(instance is StatefulWidget){
      return instance.runtimeType.name; // => !!!
    }
  }
}

注意:我并不是想实际获得路线名称。这只是我在此问题中使用的一个概念,因此请不要提出更好的方法来使路线名称井井有条。

1 个答案:

答案 0 :(得分:1)

您不能那样做,人们在this issue中谈到了这一点。

不过,您可以使用类成员和键入系统来完成此操作。

abstract class Routed {
  String getClassRoute();
}

class ChatsScreen extends StatefulWidget implements Routed {
  var arguments;
  static const name = "myexampleroutename";

  ChatsScreen(this.arguments);

  createState() => ChatsScreenState();

  @override
  String getClassRoute() {
    return ChatsScreen.name;
  }
}

class RouteHelper {
  String getRouteName(Routed instance) {
    return instance.getClassRoute();
  }
}

我说不能,但是使用dart:mirrors是可以的,但是在Flutter软件包中是banned。有reflectable软件包试图使用代码生成来解决此问题,但我不知道它的状态/可靠性。