Home > database >  How to set a default value dependent on the value of another attribute in an Entity / Model?
How to set a default value dependent on the value of another attribute in an Entity / Model?

Time:01-19

For example, every time I want to create a new entity or model, there is an attribute called global that I need to set to true or false depending on its other attribute called id :

If the id is 0, I want the global to be true

Entity :

class Folder extends Equatable {
  const Folder({
    required this.id,
    required this.global /// here i want this.global = (id == 0)
  });

  final int id;
  final bool global;

  @override
  List<Object> get props {
    return [
      id,
      global,
    ];
  }
}

Model :

class FolderModel extends Folder{
  FolderModel ({
    required this.id,
    required this.global,
  }) : super(
    id: id,
    global: global,
  );

  FolderModel copyWith({
    int? id,
    bool? global,
  }) {
    return FolderModel(
      id: id ?? this.id,
      global: global ?? this.global,
    );
  }

  Map<String, dynamic> toMap() {
    final result = <String, dynamic>{};
  
    result.addAll({'id': id});
    result.addAll({'global': global});
  
    return result;
  }

  factory FolderModel.fromMap(Map<String, dynamic> map) {
    return FolderModel(
      id: map['id']?.toInt() ?? 0,
      global: map['global'] ?? false,
    );
  }

  String toJson() => json.encode(toMap());

  factory FolderModel.fromJson(String source) => FolderModel.fromMap(json.decode(source));

}

Where should I add that, or should I create a special function to read that value ? or just don't add anything and everything is logic out of these classes ?

CodePudding user response:

The best way would be to make global a getter, since you don't use it anyway.

In case you do want the explicit option of having a global with an id, the simplest way to achieve this is:

class Folder {
  const Folder({
    required this.id,
    bool? global
  }) : global = (global ?? (id == 0));

  final int id;
  final bool global;
  
  @override
  String toString() {
      return 'id=$id, global: $global';
  }
}


void main() {
  const configurable = Folder(id: 17, global: true);
  const automaticGlobal = Folder(id: 0);
  const automaticNonGlobal = Folder(id: 17);
  
  print(configurable);
  print(automaticGlobal);
  print(automaticNonGlobal);
}

By making global a non-required named parameter, it is optional. If you set it, the value will be used, if you don't, the value will be calculated.

This will print:

id=17, global: true
id=0, global: true
id=17, global: false

CodePudding user response:

I think you can try use factory constructor :

import 'package:equatable/equatable.dart';

class Folder extends Equatable {
  const Folder({required this.id, required this.global});

  final int id;
  final bool global;

  factory Folder.byId(int id, {bool? global}) {
    return Folder(id: id, global: global ?? id == 0);
  }

  @override
  List<Object> get props {
    return [
      id,
      global,
    ];
  }
}

CodePudding user response:

IMO this will work for your issue:

class Folder extends Equatable {
  Folder({required this.id, required this.global
      }) {
    global = (id == 0);
  }

  int id;
  bool global;

  @override
  List<Object> get props {
    return [
      id,
      global,
    ];
  }
}
  • Related