這個問題在這里已經有了答案: 為什么我的通用 StatefulWidget 類在運行時會出現 TypeError? (1 個回答) 2天前關閉。
我正在嘗試創建一個在回呼中使用泛型型別作為引數的類,該回呼回傳 Flutter 的 Widget 的某些子型別。這是我開始的:
class Subscriber<P extends PublishingController> extends StatefulWidget {
const Subscriber({required this.builder, Key? key}) : super(key: key);
final Widget Function(P) builder;
@override
_SubscriberState<P> createState() => _SubscriberState<P>();
}
class _SubscriberState<P extends PublishingController> extends State<Subscriber> {
final P publisher = GetIt.instance.get<P>();
@override
void initState() {
publisher.subscribe(rebuild);
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.builder(publisher);
}
@override
void dispose() {
publisher.unsubscribe(rebuild);
super.dispose();
}
void rebuild() {
setState(() {});
}
}
...與發布者:
mixin Publisher {
List<Function> subscribers = <void Function()>[];
void subscribe(Function f) {
subscribers.add(f);
}
void unsubscribe(Function f) {
subscribers.remove(f);
}
void publish() {
for (var f in subscribers) {
f();
}
}
}
class PublishingController with Publisher {}
...以及我如何稱呼它:
child: Subscriber<MapController>(
builder: (controller) => Column(...
... 和:
class MapController extends PublishingController {...
...但這給了我錯誤:
======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building Subscriber<MapController>(dirty, state: _SubscriberState<MapController>#d7e05):
type '(MapController) => Column' is not a subtype of type '(PublishingController) => Widget'
我想我是通過泛型指定引數型別,而函式可以回傳其回傳型別的子型別——我在這里做錯了什么?
編輯:
我得到了它的作業,但我沒有把它作為答案——我不明白問題是什么,或者為什么這個版本有效;我將訂閱者類更改為:
abstract class Builder<P extends PublishingController> extends StatefulWidget {
const Builder({required this.builder, Key? key}) : super(key: key);
final Widget Function(P) builder;
}
class Subscriber<P extends PublishingController> extends Builder<P> {
const Subscriber({required builder, Key? key}) : super(builder: builder, key: key);
@override
_SubscriberState<P> createState() => _SubscriberState<P>();
}
如果有人想解釋為什么此更改會有所作為,請將其放在答案中,我很樂意接受。
uj5u.com熱心網友回復:
您的_SubscriberState<P>類 extends State<Subscriber>,在您的情況下是簡寫State<Subscriber<PublishingController>>,而不是for State<Subscriber<P>>。
因此,_SubscriberState<P>的繼承widget成員的靜態型別是Subscriber<PublishingController>, 的靜態型別widget.builder是Widget Function(PublishingController)。在運行時,關聯Subscriber物件具有對物件的參考Column Function(MapController)。但是,不能將其視為 a,Widget Function(PublishingController)因為它不接受所有PublishingController引數,因此最終會出現運行時錯誤。
請參閱:為什么我的通用 StatefulWidget 類在運行時會出現 TypeError?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460181.html
