Flutter/Dart:子类化冻结的数据类

Posted

技术标签:

【中文标题】Flutter/Dart:子类化冻结的数据类【英文标题】:Flutter/Dart: Subclass a freezed data class 【发布时间】:2020-11-26 19:44:26 【问题描述】:

我正在使用以下插件:https://pub.dev/packages/freezed

我想对冻结的数据类进行子类化,以便在我的数据层中提供额外的功能。 所以我的数据类看起来像:

import 'dart:ui';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'card.freezed.dart';

@freezed
abstract class Card with _$Card 
  factory Card(String text, Color color, List<String> categories) = _Card;

现在我想让这个 Card 类作为 CardModel 的超类,这样 CardModel 就可以访问相同的字段、copyWith 方法、值相等...... 但我不知道该怎么做。我正在尝试这样的事情:

import 'package:flutter/widgets.dart';
import 'package:growthdeck/features/card_deck/domain/entities/card.dart';

import '../../domain/entities/card.dart';

abstract class CardModel extends Card 
  factory CardModel.fromMap(Map<String, dynamic> card) => Card(
        text: card["text"],
        color: Color(int.parse(card['color'])),
        categories: card['categories'] as List<String>,
      );

这会引发以下错误:

package:growthdeck/features/card_deck/data/models/card_model.dart 11:9  new CardModel.fromMap
test/features/card_deck/data/models/card_model_test.dart 13:23          main.<fn>

type '_$_Card' is not a subtype of type 'CardModel' in type cast

有没有办法正确地做到这一点?我的解决方法是简单地将 Card 类“包装”在 CardModel 中,并提供一个不太优雅的 toCard() 方法:S

【问题讨论】:

冻结的类不会被子类化 @RémiRousselet 有没有办法解决这个问题? :S 或者我想做的事情的整个想法是坏的? 还有一个特定的原因,它们没有被子类化,或者仅仅是因为有/不需要它们? 不,没有办法解决这个问题。这是 copyWith 正常工作的要求。使用对象组合而不是继承 @RémiRousselet 好的,谢谢 :) 如果您将此作为答案发布,我可以接受 :) 【参考方案1】:

Freezed 目前不支持继承,因此建议使用组合而不是创建者在此处提到的继承:

https://github.com/rrousselGit/freezed/issues/464

在帖子的 cmets 中。

【讨论】:

以上是关于Flutter/Dart:子类化冻结的数据类的主要内容,如果未能解决你的问题,请参考以下文章

Flutter基础组件02Container

Flutter基础组件05Icon

Flutter基础组件06Icon

Flutter——dart

如何在 Windows 上使用 dart-sdk (dart2native) 和 flutter/dart-sdk?

使用 self.delegate 子类化 UITextField 会导致应用程序冻结,CPU 峰值达到 100%