Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a way to dynamically call a method or set an instance variable in a class in Dart?

I would want to be able to do something like this with a Dart class constructor:

class Model {

  // ... setting instance variables

  Model(Map fields) {
    fields.forEach((k,v) => this[k] = v);
  }

}

Obviously, this doesn't work, because this doesn't have a []= method.

Is there a way to make it work or is it simply not "the dart way" of doing things? If it's not, could you show me what would be the right way to tackle this?

like image 621
snitko Avatar asked Jan 17 '23 17:01

snitko


2 Answers

You can use Mirrors:

InstanceMirror im = reflect(theClassInstance);

im.invoke('methodName', ['param 1', 2, 'foo']).then((InstanceMirror value) {
  print(value.reflectee); // This is the return value of the method invocation.
});

So, in your case you could do this (since you have setters):

import 'dart:mirrors';

class Model {
  Model(Map fields) {
    InstanceMirror im = reflect(this);
    fields.forEach((k, v) => im.setField(k, v)); // or just fields.forEach(im.setField);
  }
}

The documentation for InstanceMirror might come in handy.

like image 110
Kai Sellgren Avatar answered Apr 07 '23 05:04

Kai Sellgren


Currently no. You will have to wait for reflection to arrive in Dart before something like this (hopefully) becomes possible. Until then your best bet is probably to do it in a constructor. Alternatively you could try to use something like JsonObject which allows you to directly initialize it from a Map (for an explanation on how this works, check this blog post).

like image 22
Lars Tackmann Avatar answered Apr 07 '23 06:04

Lars Tackmann