如何模式匹配类的runtimeType?

问题描述 投票:0回答:1

我正在 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。但我想知道是否有更好的方法来模式匹配冻结类的类型。

flutter dart flutter-freezed
1个回答
4
投票

正在做:

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');
    }
© www.soinside.com 2019 - 2024. All rights reserved.