你能評論嗎?
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;
}),
)
uj5u.com熱心網友回復:
當你這樣做時:
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;
}),
uj5u.com熱心網友回復:
這種方式應該有效:
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;
});
}
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474117.html
