【问题标题】:Dart: Initialize enum from JavaScript varDart:从 JavaScript var 初始化枚举
【发布时间】:2014-01-19 22:37:03
【问题描述】:

在我的 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,但不确定如何制作。这里有什么解决办法?

【问题讨论】:

    标签: enums environment-variables constants dart dart2js


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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2011-05-23
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多