请考虑以下代码:

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
  • 最佳答案

    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;
    
    根据情况,我使用isas。通常我不使用as,因为它的性能开销很小(?)。
    您可以采取另一种方法,我个人更喜欢这种方法。这样编写代码:
    ButtonElement btnSend = query('#btnSendToServer');
    
    在开发时,请以检查模式运行:
    dart --checked foo.dart
    
    或者,当您使用Dartium时,read about launching Dartium manually with flags。我已经有一段时间没有使用Dart Editor了,所以我不确定默认情况下它是否使用选中模式,是否可以更改它。
    在检查模式下运行时,如果类型不匹配,则会向btnSend分配。这样做的好处是,当您在没有检查模式的生产环境中运行代码时,您的应用程序将不会遭受任何性能开销。
    并回答一些个人问题:query是否支持显式/隐式强制转换?
    不。它只是一个随机函数,不关心类型。
    是否存在仅搜索ButtonElement的查询?
    您可以这样写:
    query('button#btnSendToServer')
    
    这是一个典型的CSS选择器,而不是Dart。
    我应该担心查询返回的对象还是盲目相信将返回的对象是ButtonElement
    是的,没有。我相信,如果对象不是ButtonElement,它将最终在某个时候抛出您的应用程序,但是我建议您在开发和编写类似代码时以检查模式运行:
    ButtonElement btnSend = query('#btnSendToServer');
    
    由您决定要输入多少类型的信息。如果您认为按钮很容易是错误的类型,那么我认为指定类型是有意义的。就我个人而言,我不会对类型感到发狂,仅在我认为它们有意义的地方。

    08-17 17:57