メインコンテンツにスキップ

address_receiver

`.address` のレシーバーは、具体的な `TypedData`、具体的な `TypedData` の `[]`、`Array`、`Array` の `[]`、Struct のフィールド、または Union のフィールドである必要があります。

説明

#

静的型が許可された FFI 型のいずれでもないレシーバーで .address getter が使用されている場合、アナライザーはこの診断を生成します。.address getter は、FFI データ構造の基になるメモリへの Pointer を取得するために使用されます。

.address のレシーバーは、次のいずれかである必要があります。

  • 具体的な TypedData インスタンス (例: Uint8List)。
  • [] を介してアクセスされた、具体的な TypedData インスタンスの要素。
  • Array<T> インスタンス (dart:ffi から)。
  • [] を介してアクセスされた、Array<T> インスタンスの要素。
  • フィールドの型が Array<T>、ネストされた Struct、またはネストされた Union である場合、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 は、TypedDataArrayStruct、または 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);
}