3

请考虑以下代码:

ButtonElement btnSend = (ButtonElement) query('#btnSendToServer');

我收到一个内部错误:

Internal error: 'http://127.0.0.1:3030/home/Seth.Ladd/Projects/DartSimpleChat/SimpleChatClient/web/out/simplechatclient.dart': Error: line 30 pos 43: semicolon expected

ButtonElement btnSend = (ButtonElement) query('#btnSendToServer');
                                        ^

所以问题是:

  • 这是进行显式转换的正确方法吗?
  • 是否query支持显式/隐式强制转换?
  • 我应该担心返回的对象query还是我可以盲目地相信将返回的对象是ButtonElement
  • 是否有一个ButtonElements只能搜索的查询?
4

1 回答 1

7

Dart 是一种动态类型语言。即使你到处抛出类型,它仍然是动态的。所以考虑到这一点,通常当你在施放时,这意味着你想确定这个东西是特定类型的。

在你的情况下,你想确保它是一个ButtonElement. 您可以使用isas运算符进行类型测试:

// You can write code to test the type yourself:
if (btnSend is! ButtonElement) throw 'Not a button';

// Or you can use "as" that will throw if the type is wrong:
var btnSend = query('#btnSendToServer') as ButtonElement;

根据情况,我使用isor as。通常我不使用as,因为它有(小?)性能开销。

您可以采取另一种方法,我个人更喜欢这种方法。像这样编写代码:

ButtonElement btnSend = query('#btnSendToServer');

当你在开发时,在检查模式下运行:

dart --checked foo.dart

或者,当您使用 Dartium 时,请阅读有关使用 flags 手动启动 Dartium 的信息。我有一段时间没有使用 Dart Editor,所以我不确定它是否默认使用检查模式以及是否可以更改它。

在检查模式下运行时,btnSend如果类型不匹配,分配 to 将抛出。这样做的好处是,当您在没有检查模式的情况下在生产环境中运行代码时,您的应用程序不会受到任何性能开销的影响。

并回答一些个别问题:

是否query支持显式/隐式强制转换?

不,这只是一个不关心类型的随机函数。

是否有仅搜索ButtonElements 的查询?

您可以编写如下内容:

query('button#btnSendToServer')

这是一个典型的 CSS 选择器,而不是 Dart 的东西。

我应该担心从查询返回的对象还是我可以盲目地相信该对象将被返回ButtonElement

是和不是。如果对象不是 a ,我相信它最终会在某个时候抛出您的应用程序ButtonElement,但我建议您在开发和编写时以检查模式运行,例如:

ButtonElement btnSend = query('#btnSendToServer');

由您决定要输入多少类型信息。如果您认为按钮很容易成为错误类型,那么我认为指定类型是有意义的。就我个人而言,我不会对类型感到疯狂,只在我认为它们有意义的地方。

于 2013-04-07T17:18:18.557 回答