Flutter 通用函数回调

Flutter generic function callback

你能发表评论吗?

typedef ButtonChangedCallback = void Function<T>(T value);

class MyWidget<T> extends StatefulWidget {
  ButtonChangedCallback? onCallback;
  const MyWidget(
      {required Key key,
      this.onCallback})
      : super(key: key);

我想创建这样的模板小部件以用于不同的枚举。因此它可以表示从枚举中选择了什么值。 但是我找不到以后如何分配给“onCallback”方法。

MyWidget(
        key: const Key("RadioControls"),
        onCallback: <MyEnum>(MyEnum value) =>
          setState(() {
            someSettings.value = value;
          }),
      )

这不适用于 MyEnum 类型的值无法分配给 MyEnum 类型的变量通过一些实验我发现 lambda 内部似乎与之前定义的 MyEnum 不对应。

编辑:解决方案

typedef ButtonChangedCallback<T> = void Function(T value);

class MyWidget<T> extends StatefulWidget {
  ButtonChangedCallback<T>? onCallback;

用作

MyWidget<MyEnum>(
        key: const Key("RadioControls"),
        onCallback: (MyEnum value) =>
          setState(() {
            someSettings.value = value;
          }),
      )

这种方式应该可行:

class MyWidget<T> extends StatefulWidget {
  final Function<T>? callback;
  const MyWidget({required this.key, this.callback}) : super(key: key);
}

然后您以这种方式实例化小部件:

MyWidget<MyEnum>(
  key: const Key("RadioControls"),
  callback: (MyEnum value) {
    setState((){
      someSettings.value = value;
    });
  }
)

当你这样做时:

typedef ButtonChangedCallback = void Function<T>(T value);

class MyWidget<T> extends StatefulWidget {
  ButtonChangedCallback? onCallback;

您声明 ButtonChangedCallback 必须是泛型函数。分配给 MyWidget.onCallback 的任何回调本身都必须是通用的。也就是说,您只能将其用作:

MyWidget(onCallback: <T>(T x) { ... });

在上面,T 是通用匿名函数的类型 参数 的名称。它不是类型 参数 T 可以命名为任何东西,而在您的尝试中,您碰巧将其命名为 MyEnum,因此您最终陷入了一个令人困惑的境地,即泛型类型参数与实际类型具有相同的名称。

此外,函数的类型参数与 MyWidget 的类型参数无关。

您可能想要 typedef 是通用的,而 Function 对象不是:

typedef ButtonChangedCallback<T> = void Function(T value);

class MyWidget<T> extends StatefulWidget {
  ButtonChangedCallback<T>? onCallback;

现在您可以将其用作:

MyWidget<MyEnum>(
  onCallback: (value) =>
    setState(() {
      someSettings.value = value;
    }),