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

iaqfqrcu  于 2023-03-31  发布在  Flutter
关注(0)|答案(2)|浏览(126)

我想从Type中定义的对象类型或从String中定义的对象名称创建Object。下面的示例使用String来保存对象类型。但我认为这并不那么优雅-即使使用Type,对于许多对象类型,此if块也会急剧增加...
我还没有找到一个更好的解决方案。我如何从指定的对象类型动态创建该对象?

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

cunj1qz11#

这是另一种方法。

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);
}

它的可伸缩性更强一些(因为只依赖于将类构造函数添加到Map中)。
解释:

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。为什么?因为它允许我们在常数时间内通过某个键访问某个值。在这种情况下,键是String 'Event','Content',但也可以是你想要的类型。为了简单起见,让它们是String。值是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);
}

最后,你可以很容易地示例化这些类,只需要类型为string,并向函数传递你想要的值(在这个例子中是一个键为'test'的map)。
在你的例子中,会是这样的:

data = types[model](result);
7vux5j2d

7vux5j2d2#

我也遇到了类似的问题。下面是我如何解决的:
创建类的对象:

class a{ 
a.fromMap(_map){}}

class b{
b.fromMap(_map){}}

Map<String,Dynamic> obj (){
return { 
"a":a,
"b":b}

现在我们可以利用obj对象来执行所需的操作
希望这能帮上忙

相关问题