Flutter:从类型或字符串创建对象

时间:2020-02-16 13:22:31

标签: flutter dart

我想从 Type 中定义的对象类型或从 String 中定义的对象名称创建对象。下面的示例使用 String 来保存对象类型。但是我认为这不是那么优雅-即使使用 Type ,对于许多对象类型,如果if块也会急剧增加...

我还没有找到更好的解决方案。如何从指定的对象类型动态创建该对象?

if (model == 'Event') {
  data = Event.fromMap(result);
}
else if (model == 'Content') {
  data = Content.fromMap(result);
}
else if (...) {
  // ...
}

1 个答案:

答案 0 :(得分:1)

这是另一种方法。

class Event{
  Event.fromMap(_map){
    print('This is an event');
    print(_map);
  }
}

class Content{
  Content.fromMap(_map){
    print('This is a content');
    print(_map);
  }
}

Map<String, Function> types = {
  'Event' : (_map)=>Event.fromMap(_map),
  'Content' : (_map)=>Content.fromMap(_map),
};

void main() {
  var a = types['Event']({'test':'success_event'});
  print(a.runtimeType);
  var b = types['Content']({'test':'success_content'});
  print(b.runtimeType);
}

它更具可扩展性(因为仅取决于将类构造函数添加到地图中)。

说明:

class Event{
  Event.fromMap(_map){
    print('This is an event');
    print(_map);
  }
}

class Content{
  Content.fromMap(_map){
    print('This is a content');
    print(_map);
  }
}

在这里,我们正在创建测试类。没什么重要的。

Map<String, Function> types = {
  'Event' : (_map)=>Event.fromMap(_map),
  'Content' : (_map)=>Content.fromMap(_map),
};

在这里,我们正在定义Map。为什么?因为它允许我们在恒定时间内通过某个键访问某些值。在这种情况下,键是字符串“事件”,“内容”,也可以是您想要的类型。为了简单起见,让它们为Strings。值是Function,在此示例中仅作为参数_map获得(因为示例中的Class构造函数需要一个参数_map)。因此,如果需要更多类型,只需添加类型和封装该类型的构造函数的函数即可。

void main() {
  var a = types['Event']({'test':'success_event'});
  print(a.runtimeType);
  var b = types['Content']({'test':'success_content'});
  print(b.runtimeType);
}

最后,您可以轻松地实例化类。仅在使用字符串类型并将所需的值传递给函数时(在此示例中,键为“ test”的映射)。

在您的示例中,类似于:

data = types[model](result);