跳到主要内容

address_receiver

`.address` 的接收者必须是具体的 `TypedData`、具体的 `TypedData` 的 `[]` 访问结果、`Array`、`Array` 的 `[]` 访问结果、Struct 字段或 Union 字段。

描述

#

当 `.address` getter 用于静态类型不是允许的 FFI 类型之一的接收者时,分析器会生成此诊断。`.address` getter 用于获取 FFI 数据结构底层内存的 `Pointer`。

`.address` 的接收者必须是以下类型之一

  • 一个具体的 `TypedData` 实例(例如,`Uint8List`)。
  • 通过 `[]` 访问的具体 `TypedData` 实例的元素。
  • 一个 `Array` 实例(来自 `dart:ffi`)。
  • 通过 `[]` 访问的 `Array` 实例的元素。
  • 一个 `Struct` 或 `Union` 子类的字段,如果该字段的类型是 `Array`、嵌套 `Struct` 或嵌套 `Union`。
  • 一个 `Struct` 或 `Union` 实例。

示例

#

以下代码对各种不正确的接收者生成此诊断

dart
import 'dart:ffi';

final class MyStruct extends Struct {
  @Uint8()
  external int x;

  @Uint8()
  external int y;
}

@Native<Void Function(Pointer)>(isLeaf: true)
external void nativeLeafCall(Pointer ptr);

void main() {
  final struct = Struct.create<MyStruct>();
  final y = struct.y;
  // Incorrect: The receiver is not a struct field, but some integer.
  nativeLeafCall(y.address);
}

常见修复

#

确保 `.address` getter 的接收者是允许的类型之一。`.address` getter 用于获取 `TypedData`、`Array`、`Struct` 或 `Union` 实例及其某些字段/元素的内存 `Pointer`。

dart
import 'dart:ffi';

@Native<Void Function(Pointer)>(isLeaf: true)
external void nativeLeafCall(Pointer ptr);

final class MyStruct extends Struct {
  @Uint8()
  external int x;

  @Uint8()
  external int y;
}

void main() {
  final struct = Struct.create<MyStruct>();
  // Correct: The receiver is a struct field.
  nativeLeafCall(struct.y.address);
}