我正在编写一个树实用程序,需要能够传递一些匿名函数。我喜欢在可能的地方进行强类型化,并且我知道可以通过使用动力学来实现。
我要创建的typedef将返回models键和parentKey,以便树处理程序可以从平面集合中生成树。
这是我拥有的伪代码:
typedef KeySelector<T> = dynamic Function<T>(T item);
/// The handler for tree structures
class TreeHandler<T> {
/// The items in a flattened structure
final List<T> items;
/// Selector function for an items key
final KeySelector<T> keySelector;
/// Selector function for an items parent key
final KeySelector<T> parentKeySelector;
/// The actual tree the items
/// are converted into
List<TreeNode<T>> tree;
TreeHandler(this.items, this.keySelector, this.parentKeySelector);
}
使用此实用程序的类具有以下初始化代码:
class MyModel {
MyModel({this.id, this.parentId});
int id;
int parentId;
}
_treeHandler = TreeHandler<MyModel>(
null,
<MyModel>(MyModel m) => m.id,
<MyModel>(MyModel m) => m.parentId,
);
在这里,我收到错误消息:“ [dart]未为类Object定义吸气剂ID”。
我尝试了不同类型的方法来正确初始化TreeHandler,但似乎无法正确完成它。
例如,此初始化有效,但不再强类型输入:
_treeHandler = TreeHandler<MyModel>(
null,
<MyModel>(dynamic m) => m.id,
<MyModel>(dynamic m) => m.parentId,
);
我可能正在滥用框架,但我确实希望通过使用泛型来实现这一目标。
答案 0 :(得分:2)
这对我有用
typedef KeySelector<T> = dynamic Function(T item);
class TreeNode<T> {}
/// The handler for tree structures
class TreeHandler<T> {
/// The items in a flattened structure
final List<T> items;
/// Selector function for an items key
final KeySelector<T> keySelector;
/// Selector function for an items parent key
final KeySelector<T> parentKeySelector;
/// The actual tree the items
/// are converted into
List<TreeNode<T>> tree;
TreeHandler(this.items, this.keySelector, this.parentKeySelector);
}
class MyModel {
MyModel({this.id, this.parentId});
int id;
int parentId;
}
void main() {
var _treeHandler = TreeHandler<MyModel>(
null,
(MyModel m) => m.id,
(MyModel m) => m.parentId,
);
}
我认为主要的问题是您有2个具有相同名称的通用参数,其中一个隐藏了另一个
typedef KeySelector<T> = dynamic Function<T>(T item);
这是泛型函数的泛型typedef,其中KeySelector<T>
为typedef引入泛型参数T
,而Function<T>
为泛型函数引入泛型参数T
。
更改为
typedef KeySelector<T> = dynamic Function(T item);
解决了这个问题。