Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inherits class with immutable #70

Open
AbdAlrahmanShammout opened this issue Nov 29, 2022 · 1 comment
Open

Inherits class with immutable #70

AbdAlrahmanShammout opened this issue Nov 29, 2022 · 1 comment
Labels
help wanted Extra attention is needed

Comments

@AbdAlrahmanShammout
Copy link

Hello
I noticed a situation that I think is a problem, or that I could not find a solution to it
When one class inherits from another class
I can't influence variables to be of type: immutable
example here: ↓
if any solution for this
and thanks.


part 'square_model.g.dart';
@CopyWith()
class Square extends Shape {
  final String name;

  Square({
    required super.id,
    required this.name,
  });

}

abstract class Shape {
  @CopyWithField(immutable: true)
  final String id;

  Shape({required this.id});
}

Future<void> main() async {
  Square square = Square(id: '123', name: 'test');
  square.copyWith(
    id: '333', // ==> this has to be immutable
    name: 'test2',
  );
}

@numen31337
Copy link
Owner

I understand your concern. If the class’s field is inherited and initially immutable, you want to maintain its immutability in the subclass.

However, I’m not entirely sure if this is the best approach. After all, it’s a new class. While it might be the right choice, it could also cause problems for existing users. It could introduce the opposite scenario where you want to make the field mutable instead.

Unfortunately, I don’t have a good solution for this problem at the moment. Overriding the field in the subclass would yield warnings, and approaching the problem from the opposite direction, following immutability, would also lead to issues with being unable to change the definition.

In my opinion, the current implementation is the least of two evils as I don’t have a better solution at the moment.

abstract class Shape {
  Shape({required this.id});

  @CopyWithField(immutable: true)
  final String id;
}

@CopyWith()
class Square extends Shape {
  Square({
    // Will appear in copyWith as builder doesn't see the definition of `CopyWithField` in this subclass.
    required super.id,
    required this.name,
  });

  final String name;
}

@numen31337 numen31337 added the help wanted Extra attention is needed label Nov 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants