在我的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变成const,但是不确定如何做。这里有什么解决方案?

最佳答案

由于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,则可以添加异常或其他错误处理。

10-01 21:27