Dart/Flutter编译器将泛型识别为Object类型问题求助
问题根因
- 泛型参数未显式指定,Dart类型推断缺少足够约束,默认将T推导为
Object类型,导致onSuccess入参被识别为Object,无法调用对应类型的属性和方法 - 类型判断逻辑错误:
is操作符用于判断实例的类型,你代码中T is Result是判断Type类的实例是否为Result类型,永远返回false,原有分支逻辑无法正常触发
解决方案
第一步:修正handle方法的类型判断逻辑
将is/is!操作符替换为==判断类型相等:
static final expectEmpty = Result.empty(); Widget handle<T>( T Function(Map<String, dynamic>) parse, Widget? Function(ApiError)? onError, Widget Function(T) onSuccess ) { Widget? ret; if (errorPresent()) { if (onError != null) ret = onError(error!); return ret ?? handleCommonError(); } else { if (resultPresent() && T != Result) { return onSuccess(parse(result!)); } else if (T == Result) { return onSuccess(expectEmpty as T); } else { return handleCommonError(); } } }
第二步:调用handle时显式指定泛型参数
泛型参数填写你的parse函数返回的实际类型,示例中parse返回的是Articles.articles,假设对应类型为List<Article>:
if (snapshot.hasData) { return snapshot.data!.handle<List<Article>>((json) => Articles.fromJson(json).articles, (error) { //TODO: implement errors return null; }, (articles) { // 此时articles已被编译器识别为List<Article>类型,无需强制解包 return ListView.separated( itemBuilder: (context, index) { final article = articles[index]; return _newsCard(article); }, separatorBuilder: (context, index) { return const Divider(height: 0); }, itemCount: articles.length); }); }
如果你的parse返回值是可空类型,将泛型参数替换为对应可空类型即可,比如List<Article>?。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

