【问题标题】:Dart extension functions not found未找到 Dart 扩展功能
【发布时间】:2019-11-19 21:21:36
【问题描述】:

我有一个关于颤振的项目,我非常想在那里使用扩展方法。 我已将pubspec.yaml 文件升级为使用sdk: ">=2.6.0 <3.0.0"。 我创建了一个带有内容的文件list_extensions.dart

import 'dart:math';

extension ListExtension<T> on List<T> {

  T randomElement() => this.elementAt(Random().nextInt(this.length));

}

当我尝试在像这样的其他文件中使用此扩展方法时

String getRandomText(List<String> texts) => texts.randomElement();

我看到一个带有文本的编译器错误:The method 'randomElement' isn't defined for the class 'List'

但是当我尝试在 list_extensions.dart 文件中使用这个扩展方法时 - 编译器可以接受。

问题是我的其他项目可以找到我声明的所有扩展方法。

flutter doctor 说:

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel master, v1.10.17-pre.74, on Mac OS X 10.15 19A603, locale en-RU)
[!] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
    ✗ Android license status unknown.
      Try re-installing or updating your Android SDK Manager.
      See https://developer.android.com/studio/#downloads or visit https://flutter.dev/setup/#android-setup for detailed instructions.
[✓] Xcode - develop for iOS and macOS (Xcode 10.2)
[✓] Android Studio (version 3.5)
[✓] Android Studio (version 3.4)
[✓] VS Code (version 1.39.2)
[✓] Connected device (1 available)

flutter --version 说:

Flutter 1.10.17-pre.74 • channel master • https://github.com/flutter/flutter.git
Framework • revision bcc93bca23 (6 days ago) • 2019-11-13 11:31:20 -0800
Engine • revision 31cd2dfca2
Tools • Dart 2.7.0

如何强制编译器查看我的扩展方法?

【问题讨论】:

  • 必须导入定义扩展名的文件
  • 如果我手动添加导入 - 我真的可以使用我声明的扩展方法。感谢您的建议。但我认为扩展方法应该被 IDE 识别为我扩展的类的方法。我想使用自动完成。至少在不久的将来它会像我预期的那样工作吗?
  • 我从 Android 和 Kotlin 开始学习 Flutter 和 dart,对我来说,扩展方法应该在您的项目中随处可用,这似乎非常实用。否则,我应该知道已为应用程序中的哪些类声明了哪些扩展。可以找到静态函数但不能找到扩展方法?对我来说似乎不合逻辑。
  • 可能我不清楚我期望什么行为。我不想在不导入扩展方法的情况下使用它们。我完全同意这是不合适的。我只希望 IDE 能够看到它们并建议我在输入它们的名称时导入它们 - 简单的自动完成和自动导入。
  • 我知道刚刚添加了支持,但我想在这件事上留下两分钱。与 util 函数相比,扩展函数的一大好处是它们在自动完成中被建议。如果我需要知道每个扩展函数在哪里,不妨使用 Utils。事实上,使用带有建议和自动导入的 util 类可能比记住和手动输入导入行更容易。

标签: flutter dart extension-methods


【解决方案1】:

这不是你的情况,但对我来说,它在更新 Android Studio、Flutter 插件和 Dart 插件后工作。 也许它会帮助别人。

extension 方法有效的版本:

  • Android Studio 3.6.2
  • Flutter 插件 192.7761
  • Dart 插件 45.1.1

还有一点很重要,extension 必须被命名。如果没有命名,则不能在其他文件中使用:

私人extension:

extension on Banana {
  // ...
}

公众extension

extension BananaExtension on Banana {
  // ...
}

我在 Dart extension 公告on YouTube 的评论中找到它

【讨论】:

  • 看起来这在 3.6.3 中被破坏了 :(
  • 数字被交换为飞镖和颤振。
【解决方案2】:

Dart 2.7 中引入了扩展方法,因此您可以更改您的 sdk 版本:">=2.7.0

【讨论】:

  • 是的,我从一开始就声明了。但它肯定可以帮助某人
【解决方案3】:

您必须将 pubspec.yaml 中的 sdk 版本更新为 2.6

【讨论】:

    【解决方案4】:

    如果这对将来的某人有帮助,我在使用 final 的扩展名而不是类名时遇到问题。我有:

    extension StringExtensions on String {
      bool isFuture() {
        ...
      }
    }
    
    final time = 'some time of day';
    if (time.isFuture()) {
    ...
    }
    

    这是抛出一个错误,我需要解决它:

    final String time = 'some time of day';
    

    【讨论】:

      【解决方案5】:

      这是我的扩展,我在 string_extension.dart

      中创建了这个扩展
      extension EmailValidator on String {
        bool isValidEmail() {
          return RegExp(
                  r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$')
              .hasMatch(this);
        }
      }
      

      所以为了使这个扩展工作你只需要导入这个 extension_file 喜欢

      import 'package:projectname/extensions/string_extension.dart';
      
      

      然后

      final String email = 'test@gmail.com';
      if(email.isValidEmail()){
      }
      
      

      【讨论】:

        猜你喜欢
        • 2020-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 2011-10-23
        • 1970-01-01
        • 2018-03-02
        • 1970-01-01
        相关资源
        最近更新 更多