我正在 Flutter 应用程序中为主页实现无限滚动列表。该列表包含使用不同小部件呈现的不同项目。我使用冻结的包创建域模型,并使用 API 的响应进行初始化。现在我需要某种方法来区分模型以呈现正确的小部件。我决定创建一个通用的 HomeFeedItem 小部件,用于渲染。
class HomeFeedItem extends StatelessWidget {
final dynamic item;
const HomeFeedItem({Key? key, required this.item}) : super(key: key);
@override
Widget build(BuildContext context) {
final Widget widget;
switch (item.runtimeType) {
case TodayDivider:
widget = const TodayDivider();
case DateDivider:
widget = DateDivider(date: item.date);
case CheckinCTA:
widget = const CheckinCTA();
case EntryPreview:
widget = EntryPreview(
id: item.id,
title: item.title,
summary: item.summary,
);
default:
widget = const Text('Unknown item type');
}
return Column(
children: [
widget,
const SizedBox(height: 24),
],
);
}
}
问题是,例如
EntryPreview
,runtimeType
是 _$EntryPreviewImpl
,它是私有的。所以这种方法失败了,每一项都是Text("Unknown item type")
我可以为每个返回类型的模型添加一个 getter。但我想知道是否有更好的方法来模式匹配冻结类的类型。
正在做:
switch (item.runtimeType) {
case TodayDivider:
...
使用常量模式来比较
Type
返回的item.runtimeType
对象是否相等。 Type
对象的平等是对象同一性;无论类型之间的关系如何,它们仅与自身进行比较。
您应该使用与 item
匹配而不是
item.runtimeType
:的变量模式
switch (item) {
case TodayDivider _:
widget = const TodayDivider();
case DateDivider item:
widget = DateDivider(date: item.date);
case CheckinCTA _:
widget = const CheckinCTA();
case EntryPreview item:
widget = EntryPreview(
id: item.id,
title: item.title,
summary: item.summary,
);
default:
widget = const Text('Unknown item type');
}