如何通过类类型列表的索引创建Dart类实例?
解决方法
直接用Type类型的列表无法创建实例,因为Type只是类型的元数据标识,不是可调用的构造函数。下面是几种可行的实现方式:
方法一:存储构造函数/工厂函数的列表
把列表改成存储返回对应实例的函数,这样可以直接调用函数创建实例:
class ClassA {} class ClassB {} // 存储返回实例的函数 final List<Function()> classFactories = [() => ClassA(), () => ClassB()]; // 创建实例 var inst = classFactories[0](); // 得到ClassA的实例
如果类有共同的父类/接口,还可以指定更安全的类型:
abstract class Base {} class ClassA extends Base {} class ClassB extends Base {} final List<Base Function()> classConstructors = [() => ClassA(), () => ClassB()]; // 类型安全的实例创建 Base inst = classConstructors[0]();
方法二:使用反射(不推荐)
如果必须保留Type列表,可以用dart:mirrors反射实现,但注意:Flutter Release模式、Web环境默认不支持反射,且反射性能较差,尽量避免使用:
import 'dart:mirrors'; class ClassA {} class ClassB {} final List<Type> classTypes = [ClassA, ClassB]; dynamic createInstance(Type type) { // 通过反射获取类的镜像,调用无参构造函数创建实例 return reflectClass(type).newInstance(Symbol.empty, []).reflectee; } // 使用示例 var inst = createInstance(classTypes[0]); // 得到ClassA的实例
总结
优先选择方法一,通过存储构造函数/工厂函数的方式实现,既能保证类型安全,又避免了反射带来的限制和性能问题。
内容的提问来源于stack exchange,提问作者artberry
相关产品推荐
相关产品推荐

