Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

copyWith() method for Inheritance class on dart

Tags:

oop

flutter

dart

I want to implement copyWith() method for my class. Since its inhirited class, i got error:

The member being overridden.

enter image description here

my basemodel

class BaseData {
  int id;
  String? createdAt, updatedAt;

  BaseData({this.id = 0, this.createdAt, this.updatedAt});
  BaseData copyWith({
    int? id,
    String? createdAt,
    String? updatedAt,
  }) =>
      BaseData(
          id: id ?? this.id,
          createdAt: createdAt ?? this.createdAt,
          updatedAt: updatedAt ?? this.updatedAt);
}

and I have another class that extend to my BaseData model

class QcData extends BaseData{
  String name;
  QcData ({this.name =""});

  @override
  QcData copyWith({
  String? name
  }){
    return QcData(name: name ?? this.name);
 }
}

How to create copyWith() method for my model class?

Thanks in advance.

like image 209
pmatatias Avatar asked Nov 01 '25 09:11

pmatatias


2 Answers

inheritance means that a class member's definitions should remain the same when you extend, or implement a base class, in your case by doing the:

  @override
   QcData copyWith({
   String? name
  }){
     return QcData(name: name ?? this.name);
 }

this method declaration is not the same as the BaseData's since they take different sets of arguments, you should remain the arguments the same as the BaseData, so your code should be this in order to work:

class QcData extends BaseData {
  String name;
  QcData({this.name = ""});

  @override
  QcData copyWith({
    int? id,
    String? createdAt,
    String? updatedAt,
  }) {
    return QcData(name: name ?? this.name);
  }
}
like image 83
Gwhyyy Avatar answered Nov 02 '25 23:11

Gwhyyy


We also need to pass data on while creating QcData(child). I prefer modifying constructor this way.

  const QcData({
    this.name = "",
    super.id,
    super.createdAt,
    super.updatedAt,
  });

Now we have access on copyWith method these property, another cause is I like to use const constructor with final fields.

 @override
  QcData copyWith({
    String? name,
    int? id,
    String? createdAt,
    String? updatedAt,
  }) {
    return QcData(
      name: name ?? this.name,
      id: id ?? this.id,
      createdAt: createdAt ?? this.createdAt,
      updatedAt: updatedAt ?? this.updatedAt,
    );
  }

The models will be

class BaseData {
  final int id;
  final String? createdAt;
  final String? updatedAt;

  const BaseData({this.id = 0, this.createdAt, this.updatedAt});

  BaseData copyWith({
    int? id,
    String? createdAt,
    String? updatedAt,
  }) {
    return BaseData(
      id: id ?? this.id,
      createdAt: createdAt ?? this.createdAt,
      updatedAt: updatedAt ?? this.updatedAt,
    );
  }
}

class QcData extends BaseData {
  final String name;

  const QcData({
    this.name = "",
    super.id,
    super.createdAt,
    super.updatedAt,
  });

  @override
  QcData copyWith({
    String? name,
    int? id,
    String? createdAt,
    String? updatedAt,
  }) {
    return QcData(
      name: name ?? this.name,
      id: id ?? this.id,
      createdAt: createdAt ?? this.createdAt,
      updatedAt: updatedAt ?? this.updatedAt,
    );
  }
}
like image 23
Yeasin Sheikh Avatar answered Nov 02 '25 22:11

Yeasin Sheikh



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!