Как проверить тип детали из CustomEvent в Dart?

Я надеюсь, вы извините, что я ожидаю, что это настоящий вопрос новичка, но я не смог найти хорошее решение этой проблемы…

Если у меня есть простой класс...

library segmented_buttons_list;

import 'package:web_ui/observe.dart';

@observable
class SegmentedButtonData {
  String description;
  int index;

  SegmentedButtonData(this.description, this.index);

  String toString() => "$description";
}

… и отправить событие из веб-компонента с этим классом в деталях…

library segmented_buttons_list;

import 'dart:html';
import 'package:web_ui/web_ui.dart';
import 'package:segmented_buttons_list/segmented_button_data.dart';

class SegmentedButtonComponent extends WebComponent {
  int index;
  String description;

  mainAction() {
    SegmentedButtonData detail = new SegmentedButtonData(description, index);
    CustomEvent event = new CustomEvent("MainActionEvent", canBubble: true, cancelable: true, detail: detail);
    print("SegmentedButtonComponent dispatching ${event.type} for '${event.detail}'.");
    dispatchEvent(event);
  }
}

… как мне правильно протестировать и использовать эту деталь в качестве предполагаемого типа?

Я пытался использовать "is", но это не сработало в обработчике событий...

if (event.detail is SegmentedButtonData) {
  SegmentedButtonData newSBD = event.detail;
  int newIndex = newSBD.index * 3;
  print(newIndex.toString());
}

… и когда я закомментировал «если», я получил ошибку «тип« String »не является подтипом типа« SegmentedButtonData »« newSBD »».

Я пробовал использовать "как", это тоже не сработало.

Кажется, что объект «detail» представляет собой строку, хотя я отправил экземпляр SegmentedButtonData.

Нужно ли мне сериализовать/десериализовать, или мне не хватает какой-то детали? (ха-ха).


person ianmjones    schedule 05.05.2013    source источник
comment
Странный. Каково значение строки event.detail в обработчике?   -  person MarioP    schedule 06.05.2013
comment
@MarioP Если я оставлю toString () в SegmentedButtonData, он будет использоваться, но если я его закомментирую, я получу экземпляр «SegmentedButtonData».   -  person ianmjones    schedule 06.05.2013
comment
я правильно понимаю... event.detail == [your_button_data].toString()? Это странно.   -  person MarioP    schedule 06.05.2013
comment
@MarioP Я знаю, странно, не так ли? Мне нужно посмотреть, есть ли уже какие-либо ошибки, поднятые для этого, и, если нет, соберите небольшой пример и поднимите его, я думаю.   -  person ianmjones    schedule 07.05.2013
comment
Я так думаю. В качестве обходного пути, возможно, вы могли бы обернуть и развернуть объект с помощью JSON.   -  person MarioP    schedule 07.05.2013


Ответы (1)


Поскольку механизм Dart CustomEvent построен на стандартных событиях веб-браузера, чтобы другой код (JavaScript) за пределами Dart мог перехватывать события, детали CustomEvent преднамеренно сериализуются.

Это означает, что для лучшей предсказуемости лучше всего сериализовать данные для полезных данных CustomEvent вручную, чтобы можно было уверенно десериализовать.

Теоретически вы можете сделать это с помощью пакета сериализации, но это слишком много, и у меня все еще были проблемы с десериализацией, или вы можете сделать что-то столь же простое, как использование JSON (при условии, что ваши свойства класса в основном представляют собой строки, числа, списки и карты).

Класс данных теперь имеет функцию toJson()...

library segmented_buttons_list;

import 'package:web_ui/observe.dart';

@observable
class SegmentedButtonData {
  String description;
  int index;

  SegmentedButtonData(this.description, this.index);

  String toString() => "$description";

  Map toJson() {
    return {"description": this.description, "index": this.index};
  }
}

... мы сериализуем объект данных в JSON, чтобы добавить в CustomEvent...

library segmented_buttons_list;

import 'dart:html';
import 'dart:json' as json;
import 'package:web_ui/web_ui.dart';

import 'package:segmented_buttons_list/segmented_button_data.dart';

class SegmentedButtonComponent extends WebComponent {
  int index;
  String description;

  mainAction() {
    SegmentedButtonData sbd = new SegmentedButtonData(description, index);
    String detail = json.stringify(sbd);
    CustomEvent event = new CustomEvent("MainActionEvent", canBubble: true, cancelable: true, detail: detail);
    dispatchEvent(event);
  }
}

... и десериализовать для проверки и использования сведений о событии, когда мы обрабатываем событие...

Map detail = json.parse(event.detail);

if (detail is Map && detail.containsKey("description") && detail.containsKey("index")) {
  SegmentedButtonData newSBD = new SegmentedButtonData(detail["description"], detail["index"]);
  int newIndex = newSBD.index * 3;
  print(newIndex.toString());
}

Надеюсь, это поможет кому-то.

person ianmjones    schedule 10.05.2013