Dart:从JavaScript var初始化枚举

时间:2014-01-02 13:04:45

标签: enums environment-variables const dart dart2js

在我的HTML文件中,我有:

<script>
    var serverName = "dev.myapp.com:8080";
</script>

然后,在我的Dart代码中:

import "dart:js" as js;

String SERVER_NAME = js.context["serverName"];
String SIGNIN_PLACE_URL = "http://$SERVER_NAME/signin";
String SIGNOUT_PLACE_URL = "http://$SERVER_NAME/signout";

class Place {
    static const SigninPlace = const Place._(SIGNIN_PLACE_FRAGMENT_URL);
    static const SignoutPlace = const Place._(SIGNOUT_PLACE_FRAGMENT_URL);

    static get values => [SigninPlace, SignoutPlace];

    final String fragmentURL;

    const Place._(this.fragmentURL);
}

我的“枚举”中出现了关于两个值的fragmentURL个参数的错误:

  

常量创建的参数必须是常量表达式

所以看起来我需要制作这些fragmentURL s const,但不知道怎么做。这里有什么解决方案?

1 个答案:

答案 0 :(得分:1)

由于SERVER_NAME在编译时未知,因此它不能是常数。 如果您希望SigninPlace / SignoutPlace为常数SERVER_NAME也必须是常量。

可能的解决方法

class Place {
  static String SERVER_NAME;

  static final SigninPlace = const Place._("signin");
  static final SignoutPlace = const Place._("signout");

  static get values => [SigninPlace, SignoutPlace];

  String get fragmentURL {
    Map places = {
                  "signin": "http://${SERVER_NAME}/signin",
                  "signout" : "http://${SERVER_NAME}/signout" };
    return places[_fragmentURL];
  }
  final String _fragmentURL;

  const Place._(this._fragmentURL);
}

void main(List<String> args) {
  Place.SERVER_NAME = "aServer";
  print(Place.SigninPlace.fragmentURL);
}

如果将包含插值的字符串移动到函数(此处为getter),则插值将延迟到请求值为止。目前,您的SERVER_NAME已经被分配了 如果在fragmentURL设置之前请求SERVER_NAME,您可以添加例外或不同的错误处理。