2013-05-05 2 views
1

Я надеюсь, вы извините, что я ожидаю настоящий новичок вопрос, но я не смог найти хорошее решение этой проблемы ...Как проверить тип детали из 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"; 
} 

... и отправка события из WebComponent с этим классом в деталях ...

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); 
    } 
} 

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

Я попытался с помощью «это», но это не работает, если в обработчике события ...

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

... и когда я закомментировать в «если» я получил ошибку «тип«Строка 'не является подтипом типа' SegmentedButtonData '' newSBD '. ".

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

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

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

+0

Странно. Каково значение строки 'event.detail' в обработчике? – MarioP

+0

@MarioP Если я оставил toString() в SegmentedButtonData, он используется, но если я прокомментирую это, я получаю «экземпляр« SegmentedButtonData ». – ianmjones

+0

так я понимаю, что правильно ... 'event.detail == [your_button_data] .toString()'? Это странно. – MarioP

ответ

0

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

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

Теоретически вы можете сделать это с помощью пакета Serialization, но это слишком много, и у меня все еще были проблемы с десериализацией, или вы можете сделать что-то такое же простое, как использование 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()); 
} 

Hop Это помогает кому-то.