Flutter-如何从类型实例化对象

时间:2018-12-16 11:31:11

标签: dart flutter

我对原始问题的敬意。我很困惑。这是我的实际问题。

我遇到一种情况,我需要使用一些定义的类作为Type类型的对象并将其实例化为对象实例。到目前为止,我正在使用自定义的静态实例化函数来调用构造函数,它的工作原理很好。因此,我只需调用Function.apply()即可创建一个对象。除了这样做,我还可以使用任何方法使用类的Type来模拟类的构造函数。


我尝试了什么?他们说使用Mirror,这是Dart反思的解决方案。

import 'dart:mirrors'失败,错误

  

URI目标不存在

或者至少在没有准备好的情况下,如果我不知道从何处获得包裹。

import 'package:reflectable/mirrors.dart' git://github.com/dart-lang/reflectable.git 中的软件包仅定义了所有Mirror实现的类,但函数{{1} }丢失。

3 个答案:

答案 0 :(得分:2)

如果不添加括号(),则可以删除函数。您不需要dart:mirror

void main() {
  // Tear off a global function
  Function myFunction = MyClass.someStaticFunction;

  // Call it statically
  myFunction('arg');

  // Call it dynamically
  Function.apply(myFunction, ['arg']);

  // Tear it off with a precise Function Type
  void Function(String) myFunction2 = MyClass.someStaticFunction;
}

class MyClass {
  static void someStaticFunction(String someArg) {
    print('someStaticFunction $someArg');
  }
}

答案 1 :(得分:2)

您不能从代表类的Type对象创建类的实例,至少不能没有镜像(Flutter和Web平台均不支持镜像)。

您无法删除构造函数(但是,我希望我们会在某个时候添加该功能),因此最好选择创建一个静态的辅助函数来调用该构造函数,并传递该辅助函数,这是最好的选择当前的解决方案。

如果您知道此类函数所需的参数数量,则无需使用Function.apply,只需直接调用它即可。

答案 2 :(得分:1)

如果你不想用户反射,你可以这样做。

class A {
}
class B {
}

dynamic init(Type cls){
  switch (cls) {
    case A:
      return A();
    case B:
      return B();
  }
}

void main() {
  print(init(A));
  print(init(B));
}

作为最佳实践,为了保持条理并避免使用动态,您可以从公共基础扩展并调用静态构造函数。

class A extends Base{
}
class B extends Base{
}

abstract class Base{
  static Base init(Type cls){
    switch (cls){
      case A:
        return A();
      case B:
        return B();
  }}
}

void main() {
  print(Base.init(A));
  print(Base.init(B));
}

输出:

Instance of 'A'
Instance of 'B'

Process finished with exit code 0