首页 > 解决方案 > 无法在 intellijIDEA 的 .dart 文件中打开 toUpperCase() 或 toLowerCase() 的实现或声明

问题描述

在 Intellij IDEA 中使用 .dart 文件单击 F12 显示声明或 Ctrl+Alt+B 显示实现不适用于方法 toUpperCase() 或 toLowerCase()

他们与roundToDouble()和round()一起工作正常

任何想法如何解决这一问题 ?

编辑:下面是youtube上可以做到的人的屏幕截图! 在此处输入图像描述

标签: flutterintellij-ideadart

解决方案


因为String不是作为 SDK 的一部分实现的,而是特定于运行时的(String您在 SDK 中看到的类只是一个abstract 类)。因此,如果您正在编译为 JavaScript,您将使用另一个实现(正确地直接调用 JavaScript 中的相同方法)。

在VM中,这些String方法被“修补”到这个类中: https ://github.com/dart-lang/sdk/blob/ea50b03cbee9971a3e3f1cc5c832fc2dfb941654/sdk/lib/_internal/vm/lib/string_patch.dart

但如您所见:

  String toUpperCase() native "String_toUpperCase";

  String toLowerCase() native "String_toLowerCase";

这两个方法实际上是通过调用 C++ 实现来实现的。所以我们需要看这里:https ://github.com/dart-lang/sdk/blob/78df4ac452dd3ba69ac0c78559f6dde51eeeadb2/runtime/lib/string.cc

我们在哪里找到:

DEFINE_NATIVE_ENTRY(String_toLowerCase, 0, 1) {
  const String& receiver =
      String::CheckedHandle(zone, arguments->NativeArgAt(0));
  ASSERT(!receiver.IsNull());
  return String::ToLowerCase(receiver);
}

DEFINE_NATIVE_ENTRY(String_toUpperCase, 0, 1) {
  const String& receiver =
      String::CheckedHandle(zone, arguments->NativeArgAt(0));
  ASSERT(!receiver.IsNull());
  return String::ToUpperCase(receiver);
}

这个实现可以在这里找到:https ://github.com/dart-lang/sdk/blob/da9697feb96364360bfaedbb1c661c20bf7a4cb0/runtime/vm/object.cc#L22023

StringPtr String::ToUpperCase(const String& str, Heap::Space space) {
  // TODO(cshapiro): create a fast-path for OneByteString instances.
  return Transform(CaseMapping::ToUpper, str, space);
}

StringPtr String::ToLowerCase(const String& str, Heap::Space space) {
  // TODO(cshapiro): create a fast-path for OneByteString instances.
  return Transform(CaseMapping::ToLower, str, space);
}

CaseMapping可以在这里找到:https ://github.com/dart-lang/sdk/blob/da9697feb96364360bfaedbb1c661c20bf7a4cb0/runtime/platform/unicode.h#L170

等等等等...... :)


推荐阅读