[英]Dart correct way to specify generic argument type on callback function
對於與此類似的 class,我有一個奇怪的錯誤:
class UpdatableListPage<T> extends ConsumerStatefulWidget {
final StateNotifierProvider<UpdatableNotifier, List<T>> provider;
final Widget Function(T t) callbackWidget;
[...]
@override
_UpdatableListPageState<T> createState() => _UpdatableListPageState<T>();
}
class _UpdatableListPageState<T> extends ConsumerState<UpdatableListPage> {
@override
Widget build(BuildContext context) {
// Here the IDE said modelList is dynamic
var modelList = ref.watch(widget.provider);
[...]
ListView(
key: _refreshKey,
shrinkWrap: true,
scrollDirection: widget.scrollDirection,
children: [
for (final product in modelList as List<T>) widget.callbackWidget.call(product),
],
}
}
我將函數稱為:
UpdatableListPage<RsMsgMetaData>(
userPostsProvider,
callbackWidget: (t) => PostTeaserCard(t,),
),
其中PostTeaserCard
是一個有狀態的小部件,它接收一個RsMsgMetaData
object 作為參數。
IDE 表示一切正常,但在運行時,出現以下錯誤:
type '(RsMsgMetaData) => PostTeaserCard' is not a subtype of type '(dynamic) => Widget'`
似乎callbackWidget
充當(dynamic) => Widget
function,但無論如何......這個 function 應該與匿名 function 的 function 簽名兼容,對嗎?
我不知道這是怎么回事...
你寫了:
class _UpdatableListPageState<T> extends ConsumerState<UpdatableListPage> {
這相當於:
class _UpdatableListPageState<T> extends ConsumerState<UpdatableListPage<dynamic>> {
因此, _UpdatableListPageState<T>.widget.callbackWidget
的類型是Widget Function(dynamic t)
。 您不能為Widget Function(dynamic)
傳遞PostTeaserCard Function(RsMsgMetaData)
,因為后者可以使用任何參數調用,但您實際傳遞的 function 只能使用RsMsgMetaData
參數調用。
要解決此問題,請修復您的_UpdatableListPageState
class 聲明以避免隱式使用dynamic
並完全依賴於T
:
class _UpdatableListPageState<T> extends ConsumerState<UpdatableListPage<T>> {
這可能會將modelList
的類型修復為List<T>
而不是List<dynamic>
。
在analysis_options.yaml
中啟用strict-raw-types
檢查應該有助於在將來捕獲此類錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.