簡體   English   中英

Dart 在回調中指定通用參數類型的正確方法 function

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM