flutter - Dart 泛型类型作为类成员函数的类型
问题描述
我有一个使用泛型的类:Screen bloc
class ScreenWithUpdater<DataType> extends StatefulWidget {
final Updater<DataType> updater;
final Widget Function(BuildContext, DataType) bodyBuilder;
final Duration updatePeriod;
const ScreenWithUpdater({
Key key,
@required this.updater,
@required this.bodyBuilder,
@required this.updatePeriod,
}) : super(key: key);
@override
_ScreenWithUpdaterState createState() => _ScreenWithUpdaterState();
}
class _ScreenWithUpdaterState<DataType>
extends State<ScreenWithUpdater<DataType>> {
UpdateBloc<DataType> _bloc;
@override
void initState() {
super.initState();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_bloc = UpdateBloc<DataType>(
updatePeriod: widget.updatePeriod,
updater: widget.updater,
);
}
@override
void dispose() {
_bloc.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return BlocBuilder<UpdateBloc, UpdateState>(
cubit: _bloc,
builder: (
context,
state,
) {
if (state is ShowLoader) {
return LoaderWidget();
} else if (state is UpdateMainState<DataType>) {
return widget.bodyBuilder(context, state.data);
} else {
return Center(
child: Text('Something went wrong'),
);
}
},
);
}
}
当我以这样的方式调用它时:
ScreenWithUpdater<List<OrderFromApi>>(
updatePeriod: updatePeriod,
updater: OrdersPageUpdater(),
bodyBuilder: (context, orders) => OrdersPage(microOrders: orders),
),
它失败并出现异常
type '(BuildContext, List) => OrdersPage' 不是类型 '(BuildContext, dynamic) => Widget' 的子类型
但是当我用下一个方式打电话时
ScreenWithUpdater(
updatePeriod: updatePeriod,
updater: OrdersPageUpdater(),
bodyBuilder: (context, orders) => OrdersPage(microOrders: orders),
),
它工作正常
为什么?我应该改变什么来运行我的第一个版本?
解决方案
下一行有一个问题:
@override
_ScreenWithUpdaterState createState() => _ScreenWithUpdaterState();
}
然后我把这条线改成
@override
_ScreenWithUpdaterState createState() => _ScreenWithUpdaterState<DataType>();
}
现在一切正常!
推荐阅读
- python - 如何映射响应并将其保存到 Django 中的数据库?
- java - 如何记录 Shiro 输出?
- c# - 在 Azure Function 项目中添加对类库的引用导致找不到程序集
- wordpress - WordPress 是否忽略了固定链接的片段?
- python - 用于将 10 分钟和 30 分钟 NETCDF 时间序列转换为每小时 + 删除 Python 中的 NaN 的函数?
- linux - Kafka 滚动重启——在生产集群上执行 Kafka 滚动重启的正确方法是什么
- azure-devops - Azure Devops:将定义 cron 作业与实际触发器进行比较
- java - 仅使用 Spring Data JDBC 中的值列表的实体存在问题
- http - 收到所有数据后关闭流
- amazon-web-services - PUT 预签名 URL 在文件下载完成之前过期