1

在我的 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的两个值的两个参数,我在“枚举”中遇到错误:

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

所以看起来我需要制作这些fragmentURLs const,但不确定如何制作。这里有什么解决方案?

4

1 回答 1

2

正如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应该已经被分配了。如果设置了之前的请求,
您可以添加异常或不同的错误处理。fragmentURLSERVER_NAME

于 2014-01-02T13:11:57.290 回答