1

本当の初心者の質問であることをお許しいただければ幸いですが、この問題に対する適切な解決策を見つけることができませんでした…</p>

単純なクラスがあれば...

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

…その詳細を意図したタイプとして適切にテストして使用するにはどうすればよいですか?

「is」を使用してみましたが、イベント ハンドラーでは機能しませんでした...

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

…そして、「if」をコメントアウトすると、「タイプ 'String' は 'newSBD' のタイプ 'SegmentedButtonData' のサブタイプではありません。」というエラーが表示されました。

「as」を使ってみましたが、うまくいきませんでした。

SegmentedButtonData のインスタンスを送信したにもかかわらず、「詳細」オブジェクトは文字列のようです。

シリアライズ/デシリアライズする必要がありますか、それとも詳細が不足していますか? (ハハ)。

4

1 に答える 1

0

Dart の CustomEvent メカニズムは標準の Web ブラウザー イベントに基づいて構築されているため、Dart の外部にある他のコード (JavaScript) がイベントをキャッチできるため、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());
}

これが誰かの助けになることを願っています。

于 2013-05-10T15:29:11.273 に答える