leaf_call_must_not_take_handle 진단: FFI leaf 호출과 Handle 매개변수

leaf_call_must_not_take_handle 진단: FFI leaf 호출과 Handle 매개변수

Dart 분석기가 만들어 내는 leaf_call_must_not_take_handle 진단에 대한 설명이에요.

출처: FFI leaf call can't take arguments of type 'Handle'.

본문

Handle 타입의 매개변수를 가지는 함수는 FFI leaf 호출로 사용할 수 없어요.

설명

Pointer.asFunction이나 DynamicLibrary.lookupFunction 호출에서 isLeaf 인자의 값이 true인데, 반환될 함수의 매개변수 타입이 Handle인 경우 분석기가 이 진단을 만들어요. FFI에 대한 더 자세한 내용은 C interop using dart:ffi 문서를 참고해 주세요.

예시

다음 코드는 함수 pHandle 타입의 매개변수를 갖는데 isLeaf 인자가 true이기 때문에 이 진단을 만들어요.

import 'dart:ffi';

void f(Pointer<NativeFunction<Void Function(Handle)>> p) {
  p.asFunction<void Function(Object)>(isLeaf: true);
}

흔한 해결 방법

함수가 Handle 타입의 매개변수를 하나라도 갖고 있다면 isLeaf 인자를 제거하면 돼요.

import 'dart:ffi';

void f(Pointer<NativeFunction<Void Function(Handle)>> p) {
  p.asFunction<void Function(Object)>();
}

함수의 매개변수 중 Handle이 하나도 없다면 타입 정보를 바로잡아 주면 돼요.

import 'dart:ffi';

void f(Pointer<NativeFunction<Void Function(Int8)>> p) {
  p.asFunction<void Function(int)>(isLeaf: true);
}

더 알아보기