Home > Software engineering >  setting field value with a setter with field Name & value as parameter
setting field value with a setter with field Name & value as parameter

Time:12-05

I faced a problem while try building an application. the problem is that trying to set the field in SomeClass with a general setField function. my implementation was like this but faced an issue withthis[fieldName];


EDITED

class TestClass {
  String name; // <- to set this the memberName = 'name';
  int age; // <- to set this the memberName = 'age';
  // and both will use the same setField as setter.

  TestClass({required name, required age});
  // the prev code is correct and no problem with it. 


  /** the use will be like this to set the value of name **/
  /** test.setField(memberName : 'name', valueOfThatMemberName: 'test name'); // notice here **/

  /** the use will be like this to set the value of age **/
  /** test.setField(memberName : 'age', valueOfThatMemberName: 15); // notice here **/

  void setField({required String memberName, required var valueOfThatMemberName}) {
    // some extra validation and logic,..
    this[memberName] = valueOfThatMemberName; // this gives this error:
  /** Error: The operator '[]=' isn't defined for the class 'TestClass'. **/
  }
  
  // this will return the valueOfThePassedMemberName;
  getField({required String memberName}) {
    return this[memberName]; // <= this gives this error
  /** Error: The getter 'memberName' isn't defined for the class 'TestClass'. **/
    
  }
}


void main() {
  TestClass test = TestClass(name: 'alaa', age: 14);

  /** here is the way to use it. **/
  test.setField(memberName: 'name', valueOfThePassedMemberName: 'test name'); // notice here
  test.setField(memberName: 'age', valueOfThePassedMemberName: 16); // notice here
  print(test.getField(memberName: 'name')); // <- this should print the name of test object.
}

setting the values just through the setField method.


ADDING RUNABLE JS CODE

// i need to do the exact same thing here with the dart.
export class Entity {
  constructor(data: {}) {
    Object.keys(data).forEach(key => {
      this.set(key, data[key], true);
    });
  }

  get(field: string) {
    return this["_"   field];
  }

  set(field: string, value: any, initial = false) {
    this["_"   field] = value;
  }
}

CodePudding user response:

class TestClass {
  late String fieldName;
  late dynamic value;

  TestClass({required fieldName, required value});

  void setField({required String fieldName, required var value}) {
    // some extra validation and logic,..
    this.fieldName = fieldName;
    this.value = value;
  }

  getField() {
    return fieldName;
  }
  
  getValue() {
    return value;
  }
}


void main() {
  TestClass test = TestClass(fieldName: 'name', value: 'Alaa');
  
  
  test.setField(fieldName: 'name', value: 'Alaa');
  print('${test.getField()}: ${test.getValue()} ');
  
  test.setField(fieldName: 'age', value: 14);
  print('${test.getField()}: ${test.getValue()} ');
  
}

CodePudding user response:

After a lot of researching, I found that there is no way to do it directly, but there is another way i'm gonna drive you into the steps:

1- Install the package

we need to install Reflectable

Readme Changelog Example Installing Versions Scores Use this package as a library Depend on it Run this command:

With Dart:

dart pub add reflectable

With Flutter:

flutter pub add reflectable

2- Import the package into the class

import 'package:reflectable/reflectable.dart';

3- Create the Reflectable Class

class MyReflectable extends Reflectable {
    const MyReflectable() : super(invokingCapability);
}

const myReflectable = MyReflectable();

4- Add the Annotation into the class

@myReflectable
class TestClass {
   late String name;
   late int age;

   setField({required String fieldName, value}) {
       var instanceMirror = myReflectable.reflect(this);
       instanceMirror.invokeSetter(fieldName, value);
   }

   getField({required String fieldName}) {
       var instanceMirror = myReflectable.reflect(this);
       return instanceMirror.invokeGetter(fieldName);
   }
}

6- build main.reflectable.dart

run this line in project root folder

dart run build_runner build

7- Initialize the Refactable

import this line into the main.dart

import 'package:erp/main.reflectable.dart';

add this line into your main.

initializeReflectable();

8- Use it

TestClass test = TestClass();
test.setField(fieldName: 'name', value: 'Alaa');
test.getField(fieldName: 'name'); // <- this will return 'Alaa'
test.setField(fieldName: 'name', value: 'Ahmad');
test.getField(fieldName: 'name'); // <- this will return 'Ahmad'

// and the same for any other field.

test.setField(fieldName: 'age', value: 14);
test.getField(fieldName: 'age'); // <- this will return 14
test.setField(fieldName: 'age', value: 20);
test.getField(fieldName: 'age'); // <- this will return 20

Finally Thanks to who contribute to try to answer and help :-)

  • Related