Dart回调类型不匹配:void Function(Entity)无法赋值给void Function(dynamic)
问题分析
你遇到的类型不兼容错误,根源在于Dart的类型安全机制:
- 你定义的
AdderCallback是void Function(dynamic),意味着这个回调必须能接收任意类型的参数 - 而
EntityDataRepository().addEntity是void Function(Entity),它只能接收Entity类型的参数
Dart不允许把更严格的函数(只能处理特定类型)赋值给更宽泛的函数类型(要求处理任意类型),这是为了避免运行时类型错误。
解决方案:用泛型替代dynamic,实现类型安全的通用组件
把EntityAdderAppBar改成泛型组件,让它绑定到具体的实体类型,既保留通用性,又保证类型匹配。
修改后的EntityAdderAppBar
// 定义泛型回调类型 typedef AdderCallback<T> = void Function(T entity); class EntityAdderAppBar<T> extends StatelessWidget with PreferredSizeWidget { const EntityAdderAppBar({ super.key, required this.adder, required this.entity, }); // 泛型回调,只接收T类型的参数 final AdderCallback<T> adder; // 实体也是T类型 final T entity; @override Widget build(BuildContext context) { return AppBar( title: const Text('添加实体'), actions: [ IconButton( icon: const Icon(Icons.add), onPressed: () { adder(entity); }, ), ], ); } @override Size get preferredSize => const Size.fromHeight(kToolbarHeight); }
修改后的SourceItemScreen使用示例
class SourceItemScreen extends StatelessWidget { const SourceItemScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { // 假设这是你的Entity类型实例 final entityObject = Entity(); return Scaffold( appBar: EntityAdderAppBar( entity: entityObject, // 现在addEntity的类型void Function(Entity)和AdderCallback<Entity>完全匹配 adder: EntityDataRepository().addEntity, ), // 其他页面内容... ); } }
额外说明
这种泛型设计还能让组件复用在其他实体类型上,比如你有User实体时,只需这样使用:
// 假设存在User类和对应的addUser方法 appBar: EntityAdderAppBar<User>( entity: User(), adder: UserDataRepository().addUser, ),
内容的提问来源于stack exchange,提问作者Tarik Waleed
相关产品推荐
相关产品推荐

