Dart: инициализировать перечисление из JavaScript var

В моем файле 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, но не знаю как. Какое решение здесь?


person IAmYourFaja    schedule 02.01.2014    source источник


Ответы (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);
}

Если вы перемещаете строки, содержащие интерполяцию, в функцию (здесь геттер), интерполяция откладывается до тех пор, пока значение не будет запрошено. В это время ваш SERVER_NAME уже должен быть назначен.
Вы можете добавить исключение или другую обработку ошибок, если fragmentURL запрашивается до того, как будет установлен SERVER_NAME.

person Günter Zöchbauer    schedule 02.01.2014
comment
Я искал обходной путь, например использование Могу ли я динамически применять интерполяцию строк Dart, но пока не смог его найти. - person Günter Zöchbauer; 02.01.2014