Flutter中如何从泛型类型T创建本地Object实例
Dart泛型T实例化的解决思路
Dart里泛型采用类型擦除机制,运行时无法直接获取泛型参数T的构造函数,所以直接写T()会报错,下面是两种可行的解决方法:
方法一:传入实例创建回调(推荐)
在Widget的构造函数中新增一个回调参数,让外部传入创建T实例的逻辑,既能灵活生成对应类型的实例,又能保证类型安全。
修改后的代码示例:
// 定义抽象类约束T必须包含指定属性(可选,避免类型强转) abstract class HasExampleProperty { String get exampleStringProperty; } class CustomWidget<T extends HasExampleProperty> extends StatelessWidget { final T instanceOfT; // 通过构造函数接收创建T实例的回调 CustomWidget({super.key, required T Function() creator}) : instanceOfT = creator(); @override Widget build(BuildContext context) { // 有泛型约束,可直接访问属性无需强转 return Text(instanceOfT.exampleStringProperty); } } // 让目标类实现抽象类 class ExampleClass implements HasExampleProperty { @override final String exampleStringProperty; const ExampleClass({this.exampleStringProperty = "exampleValue"}); } // 使用方式 CustomWidget<ExampleClass>(creator: () => ExampleClass())
如果不需要严格类型约束,也可以简化为:
class CustomWidget<T> extends StatelessWidget { final T instanceOfT; CustomWidget({super.key, required T Function() creator}) : instanceOfT = creator(); @override Widget build(BuildContext context) { // 强转为dynamic访问属性,编译器无法推断T的结构 return Text((instanceOfT as dynamic).exampleStringProperty); } } // 使用方式不变 CustomWidget<ExampleClass>(creator: () => ExampleClass())
方法二:反射(不推荐)
可以借助dart:mirrors包通过反射创建实例,但Flutter官方不推荐这种方案——一方面会大幅增加包体积,另一方面release模式下可能被优化失效,实际项目中几乎不用。
内容的提问来源于stack exchange,提问作者Gwhyyy
相关产品推荐
相关产品推荐

