您好,我正在使用dart:ffi构建与我的本机c/c++库的接口. 我需要一种方法来获取从c到DART的回调,如sqlite中的示例:

int sqlite3_exec(
    sqlite3*,                                  /* An open database */
    const char *sql,                           /* SQL to be evaluated */
    int (*callback)(void*,int,char**,char**),  /* Callback function */
    void *,                                    /* 1st argument to callback */
    char **errmsg                              /* Error msg written here */
);

sqlite3_exec中的第三个参数是指向回调的函数指针.

那么我的问题是:有没有办法在DART中获得一个本机回调,就像在Python、c#、..

额外的: 有没有办法在flutter个项目中包含dartino个,因为这ForeignDartFunction个包含了我所需要的.

推荐答案

我有一个很好的例子.希望你能把这个改编成适合你的情况.

Example C function

EXTERNC int32_t foo(
                    int32_t bar,
                    int32_t (*callback)(void*, int32_t)
                    ) {
    return callback(nullptr, bar);
}

Dart code

第一个是typedefs.本机函数foo需要两个,DART回调需要一个.

typedef example_foo = Int32 Function(
    Int32 bar, Pointer<NativeFunction<example_callback>>);
typedef ExampleFoo = int Function(
    int bar, Pointer<NativeFunction<example_callback>>);

typedef example_callback = Int32 Function(Pointer<Void>, Int32);

以及回调的代码

  static int callback(Pointer<Void> ptr, int i) {
    print('in callback i=$i');
    return i + 1;
  }

以及查找

  ExampleFoo nativeFoo =
    nativeLib.lookup<NativeFunction<example_foo>>('foo').asFunction();

最后,像这样使用它:

  int foo(int i) {
    return nativeFoo(
      i,
      Pointer.fromFunction<example_callback>(callback, except),
    );
  }

不出所料,foo(123)打印flutter: in callback i=123并返回124

Dart相关问答推荐

我们应该将多少代码放入构造函数中?

Flutter - 自定义按钮点击区域

自定义声音推送通知不起作用

flutter命令运行失败

Dart 中使用 ifAbsent 的 Map Update 方法

在 Flutter 中将图像与左上角对齐

如何在Flutter中正确显示Snackbar?

判断Dart中是否提供了可选参数

不推荐使用AnteStorStateofType,请改用findAncestorStateOfType

Flutter-当文本字段有焦点时隐藏提示文本

Dart 交互/访问数据库

Dart null 安全性不适用于类字段

如何从列表中的元素创建逗号分隔的字符串

具有列表的 Null 感知运算符

Dart: 必须取消 Stream 订阅并关闭 StreamSinks 吗?

必须初始化不可为空的实例字段

getter 和 setter 如何改变 Dart 中的属性?

如何通过 Dart 中的值获取 Map 键?

如何在 Dart 中生成唯一 id

如何在 Dart 中创建私有变量?