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;
}),
你能发表评论吗?
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;
}),